添加自定义函数以在 dplyr 中进行汇总
adding custom function to summarise in 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)
现在我想计算每个 id
的 v1
观察值的均值和标准差。这很容易 summarise
:
df2 <- summarise(by_id,
v1.mean=mean(v1),
v1.sd=sd(v1))
现在我想添加 v1
和 v2
的线性回归的斜率
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
也可能会失败。
你可以试试这个
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
函数中的使用。
我有一个这样的数据框,每个数据框都有不同的观察结果 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)
现在我想计算每个 id
的 v1
观察值的均值和标准差。这很容易 summarise
:
df2 <- summarise(by_id,
v1.mean=mean(v1),
v1.sd=sd(v1))
现在我想添加 v1
和 v2
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
也可能会失败。
你可以试试这个
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
函数中的使用。