添加自定义函数以在dplyr中汇总

时间:2015-08-05 09:14:10

标签: r dplyr

我有一个这样的数据框,每个id都有不同的观察结果:

library(dplyr)
df <- data.frame(id=c(1,1,1,1,1,2,2,3), v1= rnorm(8), v2=rnorm(8))

然后我按id分组:

by_id <- group_by(df, id)

现在我想为每个v1计算id观测值的平均值和sd。 summarise

很容易
df2 <- summarise(by_id,
                    v1.mean=mean(v1),
                    v1.sd=sd(v1))

现在我想添加v1v2

的线性回归的斜率
df2 <- summarise(by_id,
                   v1.mean=mean(v1),
                   v1.sd=sd(v1),
                   slope=as.vector(coef(lm(v1~v2,na.action="na.omit")[2])))

然而,这失败了,我认为因为一个人(id = 3)只有一个观察,因此无法建立线性模型。

我也试过

   slope=ifelse(n()==1,0,as.vector(coef(lm(v1~v2,na.action="na.omit")[2]))))

但它也不起作用。对此有一个简单的解决方案吗?

并非如果我有多个观察但例如v2缺少值,那么lm也可能失败。

1 个答案:

答案 0 :(得分:7)

你可以试试这个

group_by(df, id) %>% do(fit = lm(v1~v2, .)) %>% summarise(intercept = coef(fit)[1],  slope= coef(fit)[2])
Source: local data frame [3 x 2]

   intercept     slope
1 -0.3116880 0.2698022
2 -1.2303663 0.4949600
3  0.3169372        NA

请注意在do函数中使用.lm