作为一项学习练习,因为我想用我自己的数据做类似的事情,我正在尝试将答案复制到 this example 确切但通过rpy2在Python中实现它。
这比我想象的更棘手,因为plyr使用了很多方便的sytax(例如as.quoted变量,汇总,函数),我发现这些东西很容易移植到rpy2。甚至没有进入ggplot2段,这是我迄今为止能够管理的,使用** {}来允许使用'。'参数:
# import rpy2.robjects as ro
# from rpy2.robjects.packages import importr
# stats= importr('stats')
# plyr = importr('plyr')
# bs = importr('base')
# r = ro.r
# df = ro.DataFrame
mms = df( {'delicious': stats.rnorm(100),
'type':bs.sample(bs.as_factor(ro.StrVector(['peanut','regular'])), 100, replace=True),
'color':bs.sample(bs.as_factor(ro.StrVector(['r','g','y','b'])), 100, replace=True)} )
# first define a function, then use it in ddply call
myfunc = r('''myfunc <- function(var) {paste('n =', length(var))} ''')
mms_cor = plyr.ddply(**{'.data':mms,
'.variables':ro.StrVector(['type','color']),
'.fun':myfunc})
这样运行没有错误,但打印生成的mms_cor给出了以下内容,这表明函数在ddply调用的上下文中无法正常工作(mms data.frame的长度为3,这就是我的想法正在计算,因为myfunc的其他输入返回不同的值):
type color V1
1 peanut b n = 3
2 peanut g n = 3
3 peanut r n = 3
4 peanut y n = 3
5 regular b n = 3
6 regular g n = 3
7 regular r n = 3
8 regular y n = 3
理想情况下,我会在总结中使用它,如在示例答案中所做的那样,对输出进行多次计算/标记,但我也无法使其工作,并且它在语法方面确实变得笨拙:< / p>
mms_cor = plyr.ddply(plyr.summarize, n=bs.paste('n =', bs.length('delicious')),
**{'.data':mms,'.variables':ro.StrVector(['type','color'])})
这与'n = 1'给出与上面相同的输出。我知道它反映了1项矢量'美味'的长度,但是无法弄清楚如何将它变成一个变量而不是一个字符串,或者它会变成哪个变量(这就是为什么我转向上面的函数) 。另外,知道如何获得as.quoted变量语法(例如 ddply(.data = mms,。(type,color),...))使用rpy2。我知道plyr有几个as_quoted方法,但我无法弄清楚如何使用它们,因为文档和示例很难找到。
非常感谢任何帮助。感谢。
修改:
lgautier用nrow而不是长度修复myfunc的解决方案。
myfunc = r('''myfunc <- function(var) {paste('n =', nrow(var))} ''')
ggplot2的解决方案,如果对其他人有用(注意必须将x和y值添加到mms_cor作为使用aes_string的解决方法(无法在Python环境中使用):
#rggplot2 = importr('ggplot2') # note ggplot2 import above doesn't take 'mapping' kwarg
p = rggplot2.ggplot(data=mms, mapping=rggplot2.aes_string(x='delicious')) + \
rggplot2.geom_density() + \
rggplot2.facet_grid('type ~ color') + \
rggplot2.geom_text(data=mms_cor, mapping=rggplot2.aes_string(x='x', y='y', label='V1'), colour='black', inherit_aes=False)
p.plot()
答案 0 :(得分:2)
由于您正在使用回调,我无法抗拒显示rpy2可以执行的一个意外事情(注意:代码未经测试,可能存在拼写错误):
def myfunc(var):
# var is a data.frame, the length of
# the first vector is the number of rows
if len(var) == 0:
nr = 0
else:
nr = len(var[0])
# any string format feature in Python could
# be used here
return 'n = %i' % nr
# create R function from the Python function
from rpy2.rinterface import rternalize
myfunc_r = rternalize(myfunc)
mms_cor = plyr.ddply(**{'.data':mms,
'.variables':ro.StrVector(['type','color']),
'.fun':myfunc_r})