如何将变量传递给ddply中的自定义函数?

slh*_*hck 3 r plyr

请考虑以下数据:

d = data.frame(
    experiment = as.factor(c("foo", "foo", "foo", "bar", "bar")),
    si = runif(5),
    ti = runif(5)
)
Run Code Online (Sandbox Code Playgroud)

我想为进行相关测试si,并ti为每个experiment因子水平.所以我以为我会跑:

ddply(d, .(experiment), cor.test)
Run Code Online (Sandbox Code Playgroud)

但我怎么传递的价值观siticor.test通话?我试过这个:

> ddply(d, .(experiment), cor.test, x = si, y = ti)
Error in .fun(piece, ...) : object 'si' not found
> ddply(d, .(experiment), cor.test, si, ti)
Error in match.arg(alternative) : 
  'arg' must be NULL or a character vector
Run Code Online (Sandbox Code Playgroud)

有什么明显我想念的吗?该plyr文件不包括给我的例子.我看到的大多数命令只涉及summarize函数调用,但是我常常做的summarize事情不起作用,如上所示.

Bro*_*ieG 6

ddply按您选择的变量(experiment此处)拆分数据框,然后将函数传递给数据框的结果子集.在您的情况下,您的函数cor.test不接受数据框作为输入,因此您需要一个转换层:

d <- data.frame(
  experiment = as.factor(c("foo", "foo", "foo", "bar", "bar", "bar")),
  si = runif(6),
  ti = runif(6)
)
ddply(d, .(experiment), function(d.sub) cor.test(d.sub$si, d.sub$ti)$statistic)
#   experiment         t
# 1        bar 0.1517205
# 2        foo 0.3387682
Run Code Online (Sandbox Code Playgroud)

此外,您的输出必须类似于矢量或数据框,这就是我刚才选择的原因$statistic,但如果您愿意,可以添加多个变量.

旁注,我必须在输入数据框中添加一个值,因为cor.test不会在2个值上运行("bar"就是这种情况).如果您想要更全面的统计数据,可以尝试:

ddply(d, .(experiment), function(d.sub) {
  as.data.frame(cor.test(d.sub$si, d.sub$ti)[c("statistic", "parameter", "p.value", "estimate")])
} )
#   experiment statistic parameter   p.value  estimate
# 1        bar 0.1517205         1 0.9041428 0.1500039
# 2        foo 0.3387682         1 0.7920584 0.3208567 
Run Code Online (Sandbox Code Playgroud)

请注意,由于我们现在返回的东西比矢量更复杂,我们需要将它强制转换为data.frame.如果要包含更复杂的值(例如置信区间,这是两个值的结果),则必须先将它们简化.