将列表从python传递到R到rpy2

时间:2013-11-01 23:00:53

标签: python r rpy2

我正在尝试从python到rpy2内对R包(ks)进行简单调用。这就是我想要实现的目标:

import rpy2.robjects as robjects

# Define two matrices.
matrix1 = [[1,1,1,1], [3,3,3,3]]
matrix2 = [[1,1,1,1], [3,3,3,3]]

# Call 'ks' function to obtain p_value.
p_val = robjects.r('''
library(ks)
kde.test(x1=matrix1, x2=matrix2)$pvalue''')

print p_val

我尝试跟随documentation from rpy2但是非常稀缺。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

根据lgautier给出的答案发布我自己的答案,因为那个答案不起作用。通过传递nrow而不是修复它,我也使它更加通用。

import rpy2.robjects as robjects
from rpy2.robjects.packages import importr
ks = importr('ks')

kde_test = ks.kde_test

matr1 = [1., 3., 1., 3., 0.2, 1.5, 0.5, 1.3]
matr2 = [1., 3., 1., 3., 0.2, 1.5, 0.5, 1.3, 0.5, 4.6]  

m1 = robjects.r.matrix(robjects.FloatVector(matr1), nrow=int(len(matr1)/2), byrow=True)
m2 = robjects.r.matrix(robjects.FloatVector(matr2), nrow=int(len(matr2)/2), byrow=True)

res = kde_test(x1 = m1, x2 = m2)

pval = res.rx2('pvalue')

print float(str(pval)[4:])

即使它最初没有起作用,所有的功劳都归功于lgautier提出的解决方案。

答案 1 :(得分:2)

获取functions in packages

from rpy2.robjects.packages import importr
ks = importr('ks')

kde_test = ks.kde_test

build matrices

import rpy2.robjects
Matrix = rpy2.robjects.r.matrix
from rpy2.robjects.vectors import IntVector
matrix1 = Matrix( IntVector([1,1,1,1, 3,3,3,3]), nrow=2)
matrix2 = Matrix( IntVector([1,1,1,1, 3,3,3,3]), nrow=2)

call functions

res = kde_test(x1 = matrix1, x2 = matrix2)

extract a named element in a list

pval = res.rx2('pvalue')