【问题标题】:Pass list from python to R through rpy2通过 rpy2 将列表从 python 传递到 R
【发布时间】:2013-11-13 05:54:02
【问题描述】:

我正在尝试从 python 中通过 rpy2R 包 (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,但它非常稀缺。任何帮助将不胜感激。

【问题讨论】:

  • 也许您必须在 python 中编写一个函数,该函数接受 matrix1 并返回用于构造此类矩阵的 R 代码:matrix(c(1, 1, 1, 1, 3, 3, 3, 3), nrow = 2, byrow = TRUE)。然后用那个长字符串替换R代码中的matrix1
  • 但是我如何将该函数传递给 R?

标签: python r rpy2


【解决方案1】:

获取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')

【讨论】:

  • 运行时返回错误:matrix1 = Matrix( [1,1,1,1, 3,3,3,3], nrow=2, byrow=True ) TypeError: __init__() got an unexpected keyword argument 'byrow'。您是否尝试运行此代码?
  • @Gabriel:我做了快捷方式,导致该错误消息。现在已编辑(注意:链接中的文档是正确的)
  • 这仍然返回错误:rpy2.rinterface.RRuntimeError: Error en chol.default(S) : la submatriz de orden 3 no es definida positiva
  • @Gabriel :在 R 中执行相同操作时,应该使用相同的数据(您在问题中选择的示例数据)。
  • 但我也用我在答案中使用的数据进行了尝试,它在我的答案正常的地方显示了同样的错误。
【解决方案2】:

根据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 提出的解决方案,即使它一开始并不奏效。

【讨论】:

    猜你喜欢
    • 2012-11-25
    • 2017-05-26
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多