使用 rpy2 省略 NA 行

Omit NA rows with rpy2

这在纯 R 中很容易。对于名为 counts 的数据框和名为 hgnc 的列,它将是这样的:

counts <- na.omit(hgnc)

如何在 rpy2 中实现相同的功能? 据我所知似乎没有 na_omit 函数。

我尝试根据字段是否为 "<NA>" 进行选择,但得到的结果非常不一致:

print r.dim(counts)
[   63677,       12]
print r.dim(counts.rx(counts.rx2('hgnc').ro == "<NA>", True))
[1] 6672   12
print r.dim(counts.rx(counts.rx2('hgnc').ro != "<NA>", True))
[1] 63677    12

请注意,它使用 == 查找包含 <NA> 的行,但是当我搜索不包含 <NA> 的行时,它只会找到每一行。当我搜索 "" 而不是 "<NA>":

时,不会发生同样的情况
print r.dim(counts.rx(counts.rx2('hgnc').ro == "", True))
[1] 27979    12
print r.dim(counts.rx(counts.rx2('hgnc').ro != "", True))
[1] 42370    12

您可以 运行 任何 R 代码使用 rpy2.robjects:

import rpy2.robjects as ro

# R SCRIPT
ro.r.source('yourRscript.R')

# R DATA FRAME
ro.globalenv['counts']

# OMIT NA ROWS
ro.r('na.omit(counts$hgnc)')

为了将来参考,您可以调用带有句点“.”的 R 函数。在名称中使用 ro.r("na.omit")(...),其中 ... 是 python 变量的列表。例如:

In [1]: from rpy2 import robjects as ro

In [2]: x = ro.r("c(1,2,NA)")

In [3]: x
Out[3]: 
<FloatVector - Python:0x1073ab758 / R:0x7fbafba8b520>
[1.000000, 2.000000, NA_real_]

In [4]: ro.r("na.omit")(x)
Out[4]: 
<FloatVector - Python:0x1073b3f80 / R:0x7fbafaa415f8>
[1.000000, 2.000000]