我正在使用Rpy2版本2.8.4与R 3.3.0和python 2.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 |
我可以毫不费力地将其转换为pandas数据帧。
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"
我理解的在创建factors in R时不是默认行为。
如果我从因子级别中删除“NA”,
r.assign('df', df)
r('df$Col3 <- factor(as.numeric(levels(df$Col3))[df$Col3])')
然后在将R数据帧转换为pandas数据帧时得到一个非常不同的结果。
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 |
我的问题是这是一个错误,还是我做错了,假设NA_Integer值不应作为R数据帧中的因子级别包含在内?
答案 0 :(得分:0)
将一个R data.frame
中的一系列因素转换为一只大熊猫DataFrame
中的一列with that code。没有以特定方式处理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
正在发生的事情是,rpy2中FactorVector
的构造函数使用的参数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没有缺失值的概念。