使用带有公式接口输入的summarise_each()

时间:2014-12-17 20:27:29

标签: r dplyr

我想让dplyr::summarise_each使用lm的公式界面。在这个简单的例子中,我基于一个二级和三级因子变量(group2和group3)从一系列变量(x,y,z)中获得效果大小估计。

set.seed(77)
example <- data.frame(group2 = factor(sample(1:2, 500, TRUE)),
                      group3 = factor(sample(1:3, 500, TRUE)),        
                      x = sample(1:100, 500, TRUE),
                      y = sample(1:100, 500, TRUE),
                      z = sample(1:100, 500, TRUE))

对于group2,我可以使用effsize:::cohen.d来获取每个变量的估算值:

library(dplyr)
library(effsize)
cooksD <- summarise_each(example[3:5], 
                         funs(cohen.d(., f = example$group2, na.rm = TRUE)$estimate))
# cooksD
#        x     y    z
# 1 -0.08 -0.13 -0.01

但是,要获得3级对象的r平方,我需要使用summary(lm())$r.squared,这不起作用:

rsq <- summarise_each(example[3:5], funs(summary(lm(. ~ group3, data = example))$r.squared))
# Error in terms.formula(formula, data = data) : 
#  invalid term in model formula

我知道这是因为我使用了&#34;。&#34;在lm()电话中,但我不确定如何将数据向量传递给lm()。我已查看过do(),但到目前为止还没有成功实施。{1}}

1 个答案:

答案 0 :(得分:2)

问题似乎是dplyr如何替换函数中的变量。而不是看起来像

lm(y~group3, example)

你会得到像

这样的东西
lm(c(99L, 74L, 31L, 82L, ...) ~group3, example)

(如果列表足够长),在尝试找出参数名称时抛出错误。另一种方法可能是

summarise_each(example[3:5], 
    funs(summary(lm(RESP ~ group3, data = cbind(example, RESP=.)))$r.squared))

这里我们将响应列绑定到data.frame,这不是那么有效。在这种情况下,我可能会避免使用summarize_each,而是希望迭代的符号更加标准lapply

lapply(names(example)[3:5], function(r) {
    eval(substitute(summary(lm(r ~ group3, data = example))$r.squared, list(r=as.name(r))))
})