Rpy2 pandas2ri.ri2py()将NA值转换为整数

时间:2016-11-17 22:47:55

标签: r python-2.7 rpy2

我正在使用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数据帧中的因子级别包含在内?

1 个答案:

答案 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没有缺失值的概念。