как использовать na_rm с функцией rpy2 rlf.tapply - PullRequest
1 голос
/ 30 января 2020

Я использую rpy2 для запуска фрагмента кода R в Python и пытаюсь использовать функциональность tapply из R следующим образом:

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. Как мне решить эту ошибку? Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Вы фактически вызываете функцию min из python. Таким образом, используемое вами rlf.tapply фактически выполняет R-подобные функции (например, tapply ..) и возвращает их в python объекте

Мы можем попробовать:

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
0 голосов
/ 30 января 2020

Как есть функция 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]
...