我有一个数据集,其中包含多个项目的年平均值。
数据有:
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))
Run Code Online (Sandbox Code Playgroud)
我需要为每个项目分别生成一个年份和平均值之间的简单线性回归模型。
想要的数据:
| year | slope | intercept |
|:----:|:------:|:----------:|
| 1 | 0.7 | 0.5 |
| 2 | -0.2 | 3.0 |
| 3 | 0.5 | 0.5 |
| 4 | 0.0 | 1.5 |
Run Code Online (Sandbox Code Playgroud)
我的尝试:
我相信这可以通过 group_by()、summarise() amd 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])
Run Code Online (Sandbox Code Playgroud)
但它为所有线返回相同的斜率和截距。换句话说,没有应用group_by。
因此,我的问题是:
如果lm( ..., data=df)您仍然使用开始时使用的相同 df 对象,为了使您自己的方法发挥作用,您需要将其替换为了解上下文(即分组)并返回当前组的当前数据的对象:cur_data()
library(dplyr)\ndf <- data.frame(item = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4),\n year = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4),\n value = c(1, 2, 3, 3, 2, 3, 4, 0, 1, 1, 3, 2, 2, 1, 1, 2))\n\ndf %>%\n group_by(item) %>%\n summarise(slope = unname(lm(value ~ year, data=cur_data())[[1]])[2],\n intercept = unname(lm(value ~ year, data=cur_data())[[1]])[1])\n#> # A tibble: 4 \xc3\x97 3\n#> item slope intercept\n#> <dbl> <dbl> <dbl>\n#> 1 1 0.7 0.5\n#> 2 2 -0.5 3.5\n#> 3 3 0.5 0.5\n#> 4 4 0 1.5\nRun Code Online (Sandbox Code Playgroud)\n创建于 2023-01-29,使用reprex v2.0.2
\n