我有一个按国家和年份水平的面板数据集,我想基于现有变量创建两个新变量。
年份 | 国家 | 变量1 | 变量2 | 变量3 | 变量4 | 变量1平均值 | 相对平均变量1 |
---|---|---|---|---|---|---|---|
1910 | 德国 | 1 | 4 | 10 | 6 | 3 | 0.333 |
1911 | 德国 | 2 | 3 | 11 | 7 | 1.5 | 1.3333 |
1910 | 法国 | 5 | 6 | 8 | 9 | 3 | 1.66667 |
1911 | 法国 | 1 | 4 | 10 | 9 | 1.5 | .66667 |
我已经有了可以解决第一部分的代码,但我希望能够尽可能有效地将其与第二部分结合起来使用。
library(dplyr)
library(purrr)
df<- df%>%
group_by(year) %>%
mutate_at(.funs = list(mean = ~mean(.)), .vars = c("var1", "var1", "var1", "var4"))
这段代码生成了一个名为var1_mean的新变量(我更喜欢mean_var1:如何更改变量名?)
对于第二步,我尝试过:
df <- df %>%
map2_dfr(.x = d.test %>%
select(var1, var2),
.y = d.test %>%
select(var1_mean, var2_mean),
~ .x / .y) %>%
setNames(c("relmean_var1", "relmean_var2"))
我遇到了错误。
""select(., var1, var2) 中的错误:对象 'd.test' 未找到。"
(我是根据这个问题设置的。)
我还尝试了:
map2(var1, var1_mean, ~ df[[.x]] / df[[.y]]) %>%
set_names(cols) %>%
bind_cols(df, .)
并得到:
"map2(var1, var1_mean, ~df[[.x]]/df[[.y]]) 中的错误:未找到对象 'var1'
最好的方法是如何结合这两个目标?理想情况下,对于(1)使用命名方案mean_var1,对于(2)使用relmean_var1。
编辑:
输入数据框应该长这样:
data <- tibble::tribble(
~year, ~country, ~var1, ~var2, ~var3, ~var.4,
1910L, "GER", 1L, 4L, 10L, 6L,
1911L, "GER", 2L, 3L, 11L, 7L,
1910L, "FRA", 5L, 6L, 8L, 9L,
1911L, "FRA", 1L, 4L, 10L, 9L
)
输出的数据框应该像这样(对于所有变量,只展示了var1作为示例,但是var2到var4的格式应该相同):
datanew <- tibble::tribble(
~year, ~country, ~var1, ~var2, ~var3, ~var.4, ~mean_var1 , ~relmean_var1
1910L, "GER", 1L, 4L, 10L, 6L, 3L, .3333L,
1911L, "GER", 2L, 3L, 11L, 7L, 1.5L, 1.3333L,
1910L, "FRA", 5L, 6L, 8L, 9L, 3L, 1.6667L,
1911L, "FRA", 1L, 4L, 10L, 9L 1.5L, .6667L,
)