2012-09-20 35 views
0

我有我嘗試使用rpy2在IPython的筆記本電腦來讀取一個相當標準的CSV數據集/ Rmagic:rpy2/Rmagic:無法讀取CSV數據文件

# R code 
%load_ext rmagic 
%R my.data <- read.csv("/Users/xxx/Documents/data.csv") 

我得到這個錯誤:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-31-844400cf68c6> in <module>() 
    25 ####Chunk 1: Inputting and checking the data 
---> 27 get_ipython().magic(u'R my.data <- read.csv("/Users/xxx/Documents/data.csv")') 
    28 get_ipython().magic(u'R summary(my.data)') 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/IPython/core/interactiveshell.pyc in magic(self, arg_s) 
    2162   magic_name, _, magic_arg_s = arg_s.partition(' ') 
    2163   magic_name = magic_name.lstrip(prefilter.ESC_MAGIC) 
-> 2164   return self.run_line_magic(magic_name, magic_arg_s) 
    2165 
    2166  #------------------------------------------------------------------------- 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/IPython/core/interactiveshell.pyc in run_line_magic(self, magic_name, line) 
    2088     kwargs['local_ns'] = sys._getframe(stack_depth).f_locals 
    2089    with self.builtin_trap: 
-> 2090     result = fn(*args,**kwargs) 
    2091    return result 
    2092 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/IPython/extensions/rmagic.pyc in R(self, line, cell, local_ns) 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/IPython/core/magic.pyc in <lambda>(f, *a, **k) 
    189  # but it's overkill for just that one bit of state. 
    190  def magic_deco(arg): 
--> 191   call = lambda f, *a, **k: f(*a, **k) 
    192 
    193   if callable(arg): 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/IPython/extensions/rmagic.pyc in R(self, line, cell, local_ns) 
    579   if return_output and not args.noreturn: 
    580    if result != ri.NULL: 
--> 581     return self.Rconverter(result, dataframe=False) 
    582 
    583 __doc__ = __doc__.format(

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/IPython/extensions/rmagic.pyc in Rconverter(Robj, dataframe) 
    113    return np.asarray(Robj) 
    114   Robj = np.rec.fromarrays(Robj, names = names) 
--> 115  return np.asarray(Robj) 
    116 
    117 @magics_class 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/numpy/core/numeric.py in asarray(a, dtype, order) 
    233 
    234  """ 
--> 235  return array(a, dtype, copy=False, order=order) 
    236 
    237 def asanyarray(a, dtype=None, order=None): 

TypeError: __float__ returned non-float (type rpy2.rinterface.NAIntegerType) 

我猜這事做與NA值在我的CSV數據。我實際上並沒有在那裏寫一個值 - 只是一個空白條目(例如1,3,4)。

我試圖用NA,空格,0等代替空白條目 - 我總是得到相同的錯誤。我究竟做錯了什麼?

編輯:我試着用純rpy2做(而不進行任何更改我的數據集):

import rpy2.robjects as robjects                                                       
myData = robjects.r['read.csv']("/Users/xxx/Documents/data.csv") 
print robjects.r['summary'](myData) 

,它工作正常!所以這必須是IPython/Rmagic的東西。

回答

2

錯誤是因爲IPython中的%R試圖將整個csv文件轉換爲dtype float的單個數組。整數列中的NA值無法轉換爲浮點數,因此會引發異常。

例如:

>>> import rpy2.robjects as ro 
>>> import numpy as np 
>>> myData = ro.r['read.csv']('data.csv') 
>>> np.asarray(myData) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/dist-packages/numpy/core/numeric.py", line 235, in asarray 
    return array(a, dtype, copy=False, order=order) 
TypeError: __float__ returned non-float (type rpy2.rinterface.NAIntegerType) 

一個簡單的修正是使用--dataframe/-d標誌%R。請注意,我們需要使用--noreturn/-n標誌,因此請確保我們不嘗試將返回值轉換爲數組(這會再次觸發錯誤)。 [可替換地,我們可以有把一個分號在命令的末尾。]

例如:

In [1]: %load_ext rmagic 

In [2]: %R -n -d myData myData <- read.csv('data.csv') 

In [3]: myData 
Out[3]: 
array([(1, 1, 1, 25, 0.590334, 0.4991572, 0.2189781, 9), 
     (1, 1, 1, 25, 0.5504164, 0.5007439, 0.2136691, 13), 
     (1, 1, 1, 25, 0.588486, 0.4879058, 0.2105431, 11), 
     (1, 1, 1, 25, 0.5882244, 0.5148501, 0.2105431, -2147483648), 
     (1, 2, 1, 25, nan, 0.489045, 0.2025757, 12)], 
     dtype=[('replicate', '<i4'), ('line', '<i4'), ('genotype', '<i4'), ('temp', '<i4'), ('femur', '<f8'), ('tibia', '<f8'), ('tarsus', '<f8'), ('SCT', '<i4')]) 

當心的是,NAInteger值換算成-2147483648(其等於numpy.iinfo('<i4').min)。

+0

假設csv文件在類型上是同類的,看起來有點大膽。可能更直觀的做法是將當前的* - dataframe *選項設爲默認選項,並創建一個新選項,例如「--homogeneous」? – lgautier

1

我從回溯中猜測某個列的類型被猜測錯了(它認爲它是一個Python浮點數,而NA是一個整數)。因爲我不知道這是否是ipython或rpy2的問題(你必須單獨使用rpy2)。如果帶有NA的列確實具有看起來像整數的數值,請添加.0並查看是否解決了問題。

+0

添加.0並沒有改變任何東西。我剛剛編輯了我的主帖,提供了純rpy2測試的代碼;它看起來像是與IPython有關。 –

+0

+ 1這是ipython的。用它們提交錯誤報告,以便得到糾正。 – lgautier

+0

完成:https://github.com/ipython/ipython/issues/2418 –