如何将 na_rm 与 rpy2 rlf.tapply 函数一起使用

how to use na_rm with rpy2 rlf.tapply function

我正在使用 rpy2 运行 Python 中的一段 R 代码,并尝试使用 R 中的 tapply 功能,如下所示:

import rpy2.rlike.functional as rlf
import rpy2.robjects.packages as rpackages
minT = rlf.tapply(all_data['T'], list(date), min, na_rm=True)

但是,我收到此错误: TypeError: tapply() 得到了一个意外的关键字参数 'na_rm'

在 R 代码中它是 na.rm,我知道我需要切换“。”到 rpy2 中的“_”。我该如何解决这个错误?谢谢!

因为是 R 函数,True 将是 TRUE 而不是 na_rm,它将是 na.rm

from rpy2.robjects.packages import importr
import rpy2.robjects as rlf
rlf.r('tapply(all_data$T, all_data$date,  FUN = min, na.rm=TRUE)')

有一个可重现的例子

>>> from rpy2.robjects.packages import importr
>>> import rpy2.robjects as rlf
>>> rlf.r('data(iris)')
>>> rlf.r('out <- tapply(iris$Sepal.Width, iris$Species, FUN = min, na.rm = TRUE)')
>>> rlf.r('out')
#R object with classes: ('array',) mapped to:
#[2.300000, 2.000000, 2.200000]

您实际上是从 python 调用 min 函数。因此,您使用的 rlf.tapply 实际上是在执行类似 R 的函数(例如 tapply..)并将它们返回到 python object

我们可以试试:

import rpy2.rlike.functional as rlf 
import rpy2.robjects.packages as rpackages
import math    
minT = rlf.tapply([float('nan'),1,2,3],[0]*2+[1]*2,min)
# returns [(0, nan), (1, 2)]

minT = rlf.tapply([float('nan'),1,2,3],[0]*2+[1]*2,
lambda x:min([i for i in x if not math.isnan(i)]))
#returns [(0, 1), (1, 2)]

当你使用 R 中但不在 python 中的函数时,你可以清楚地看到这一点:

rlf.tapply([0,1,2,3],[0]*2+[1]*2,median) 
# returns error