我正在尝试使用rpy2来调用R包MatchIt。我很难看到$ match.matrix中匹配对的结果。这是我试图在python中执行的R代码。
matched <- cbind(lalonde[row.names(foo$match.matrix),"re78"],lalonde[foo$match.matrix,"re78"])
这是我的python代码:
import readline
import rpy2.robjects
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri
from rpy2 import robjects as ro
import numpy as np
from scipy.stats import ttest_ind
import pandas as pd
from pandas import Series,DataFrame
pandas2ri.activate()
R = ro.r
MatchIt = importr('MatchIt')
base = importr('base')
df = R('lalonde')
lalonde = pandas2ri.py2ri(df)
formula = 'treat ~ age + educ + black + hispan + married + nodegree + re74 + re75'
foo = MatchIt.matchit(formula = R(formula),
data = lalonde,
method = R('"nearest"'),
ratio = 1)
matched = \
base.cbind(lalonde.rx[base.row_names(foo.rx2('match.matrix')),"re78"],
lalonde.rx[foo.rx2('match.matrix'),"re78"])
这个块运行:
lalonde.rx(base.row_names(foo.rx2('match.matrix')),
"re78")
但是这个块
lalonde.rx[foo.rx2('match.matrix'),"re78"].
返回错误:
ValueError: The first parameter must be a tuple.
的输出
cbind(lalonde[row.names(foo$match.matrix),"re78"], lalonde[foo$match.matrix,"re78"])
应该是一个数据框,它匹配foo $ match.matrix的行名和单元格值,其值为&#34; re78&#34;在lalonde数据框中
答案 0 :(得分:2)
此处lalonde
在其他地方定义(但是由于@ Parfait的问题,我们知道这是一个数据框)。现在你必须打破你的单线程,触发错误以确定故障的确切位置(我们不能为你做到这一点 - 关于自足和可重复的例子的事情是他们是帮助我们帮助你。)
matched = \
base.cbind(lalonde[base.row_names(foo.rx2('match.matrix')),"re78"],
lalonde[foo.rx2('match.matrix'),"re78"])
这是否打破了lalonde
的第一个子集?
lalonde[base.row_names(foo.rx2('match.matrix')),"re78"]
由于type(lalonde)
为rpy2.robjects.vectors.DataFrame
,因此这是一个R / rpy2数据框。提取像R一样的子集可以用.rx
来实现(如 r -style e x 牵引 - 请参阅http://rpy2.readthedocs.io/en/version_2.8.x/vector.html#extracting-r-style
)。
lalonde.rx(base.row_names(foo.rx2('match.matrix')),
"re78")
了解此次通话的内容非常重要。默认情况下,在数据结构的每个方向上提取的元素(这里分别是数据框的行和列)必须是R向量(名称的向量,或者一个偏移索引整数的向量)或转换的Python数据结构机制可以转换为R向量(名称或整数)。 base.row_names
将返回行名称(以及名称的矢量),但foo.rx2('match.matrix')
可能是其他内容。
这里type(foo.rx2('match.matrix'))
表示这是一个矩阵。使用矩阵可以用来挑选R数组中的单元格,但在这种情况下,只能有一个参数用于提取......我们现在有两个(第二个是"re78"
)。
由于match.matrix
的第一列包含lalonde
中的索引(行号),因此以下内容应该是您想要的:
matched = \
base.cbind(lalonde.rx[base.row_names(foo.rx2('match.matrix')),"re78"],
lalonde.rx[foo.rx2('match.matrix').rx(True, 1),"re78"])