我有一个数据集,其中有几个项目的年平均值。
数据有:
df <- data.frame(item = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4),
year = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4)
value = c(1, 2, 3, 3, 2, 3, 4, 0, 1, 1, 3, 2, 2, 1, 1, 2))
我需要为每个项目分别在年份和平均值之间建立一个简单的线性回归模型。
需要的数据:
| year | slope | intercept |
|:----:|:------:|:----------:|
| 1 | 0.7 | 0.5 |
| 2 | -0.2 | 3.0 |
| 3 | 0.5 | 0.5 |
| 4 | 0.0 | 1.5 |
我的尝试:
我相信可以通过group_by()、summarise()和lm()的某种组合来完成。
所以我试着这么做
library(dplyr)
df %>%
group_by(item) %>%
summarise(slope = unname(lm(value ~ year, data=df)[[1]])[2],
intercept = unname(lm(value ~ year, data=df)[[1]])[1])
但是它对所有直线返回相同的斜率和截距。换句话说,group_by没有被应用。
因此,我的问题是:
- 如何实现分组?
- 如何将计算分别应用于每个项目?
5条答案
按热度按时间rjee0c151#
另一种方法是使用
tidy
并使用pivot_wider
将结果转换为更宽的格式,如下所示(您可以添加更多结果,如p值):创建于2023年1月29日,使用reprex v2.0.2
1u4esq0p2#
下面是另一个解决方案(相当冗长),使用
group_split
创建列表,然后使用map_dfr
迭代每个列表,使用broom
stidy()
获得整洁的输出,最后生成shape:gtlvzcf83#
在
lm( ..., data=df)
中,你仍然使用你开始时使用的相同df对象,为了使你自己的方法工作,你需要用感知上下文的东西(即分组)来替换它,并返回当前组的当前数据:cur_data()
创建于2023年1月29日,使用reprex v2.0.2
qfe3c7zg4#
您可以试试
by
。也许更容易理解,但结果是一样的:
rkttyhzu5#
给出,