我使用Rpy2版本2.8.4与R3.3.0和python2.7.10一起创建一个R数据
import rpy2.robjects as ro
from rpy2.robjects import r
from rpy2.robjects import pandas2ri
df = ro.DataFrame({'Col1': ro.vectors.IntVector([1, 2, 3, 4, 5]),
'Col2': ro.vectors.StrVector(['a', 'b', 'c', 'd', 'e']),
'Col3': ro.vectors.FactorVector([1, 2, 3, ro.NA_Integer, ro.NA_Integer])})
print df
| Col2 | Col3 | Col1 |
----------------------
1 | a | 1 | 1 |
2 | b | 2 | 2 |
3 | c | 3 | 3 |
4 | d | NA | 4 |
5 | e | NA | 5 |我可以毫不费力地把它转换成熊猫的数据。
pandas2ri.ri2py(df)
| Col2 | Col3 | Col1 |
----------------------
1 | a | 1 | 1 |
2 | b | 2 | 2 |
3 | c | 3 | 3 |
4 | d | NA | 4 |
5 | e | NA | 5 |但是,我注意到FactorVector元数据包括“NA”作为一个因素级别,
print r('levels(df$Col3)')
[1] "1" "2" "3" "NA"我理解在创建R因子时,这不是默认行为。
如果我把“NA”从因子水平上降下来,
r.assign('df', df)
r('df$Col3 <- factor(as.numeric(levels(df$Col3))[df$Col3])')然后,当把R数据转换成熊猫数据时,我得到了一个完全不同的结果。
df2 = r['df']
pandas2ri.ri2py(df2)
| Col2 | Col3 | Col1 |
----------------------
1 | a | 1 | 1 |
2 | b | 2 | 2 |
3 | c | 3 | 3 |
4 | d | 1 | 4 |
5 | e | 1 | 5 |我的问题是,这是一个bug,还是我做错了什么,假设NA_Integer值不应该作为因子级别包含在R数据仓库中?
发布于 2016-11-19 16:05:02
将R data.frame中的一列因子转换为熊猫DataFrame中的一列,正在发生用那个代码。没有以特定的方式处理NAs,所以这必须发生在转换的上游。如果您查看您的列"Col3",您会发现NAs已经被列为因子中的级别。
>>> print(df.rx2("Col3"))
[1] 1 2 3 NA NA
Levels: 1 2 3 NA这甚至是R data.frame创建的上游:
>>> lst = [1, 2, 3, ro.NA_Integer, ro.NA_Integer]
>>> print(ro.vectors.FactorVector(lst))
[1] 1 2 3 NA NA
Levels: 1 2 3 NA正在发生的情况是,FactorVector在rpy2中的构造函数对参数exclude使用的缺省值与R的factor()函数中的构造函数不同(我认为这样做是为了使整数之间的映射在默认情况下用作级别向量的索引)。
R的默认行为可以通过以下方式恢复:
>>> v = ro.vectors.FactorVector(lst, exclude=ro.StrVector(["NA"]))
>>> print(v)
[1] 1 2 3 <NA> <NA>
Levels: 1 2 3这里的问题是,没有用于表示缺失值的指南(在IEEE标准的意义上)。R使用的是任意的极值,但是Python没有缺失值的概念。
https://stackoverflow.com/questions/40666458
复制相似问题