【发布时间】:2022-01-02 21:04:51
【问题描述】:
我有一个国家和年份级别的面板数据集,我想在现有变量的基础上创建两个新变量。
| year | country | var1 | var2 | var3 | var 4 | mean_var1 | relmean_var1 |
|---|---|---|---|---|---|---|---|
| 1910 | GER | 1 | 4 | 10 | 6 | 3 | 0.333 |
| 1911 | GER | 2 | 3 | 11 | 7 | 1.5 | 1.3333 |
| 1910 | FRA | 5 | 6 | 8 | 9 | 3 | 1.66667 |
| 1911 | FRA | 1 | 4 | 10 | 9 | 1.5 | .66667 |
我想做的是创建两个新变量集:(1) 一个变量集,其中包含每年(跨国家/地区)的平均值;(2) 一个包含国家/地区值相对于年平均值的变量集.例如,对于 var1(1) 将产生 mean_var1 和 (2) relmean_var1 并且我希望这些用于所有其他变量。数据集中总共有 1000 多个变量,但我只会将此函数应用于大约 6 个。
我有适用于第一部分的代码,但我想尽可能有效地将它与第二部分结合起来。
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"))
我得到错误
""选择错误(., var1, var2) : 找不到对象 'd.test'。"
。 (我从this question 得到这个设置)
我也试过了:
map2(var1, var1_mean, ~ df[[.x]] / df[[.y]]) %>%
set_names(cols) %>%
bind_cols(df, .)
得到了
“map2 中的错误(var1,var1_mean,~df[[.x]]/df[[.y]]):对象 'var1' 没找到
结合这两个目标的最佳方式是什么?理想情况下,命名方案 mean_var1 用于 (1),relmean_var1 用于 (2)
编辑: 输入数据框应如下所示:
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,
)
【问题讨论】:
-
您能澄清一下您最后的 2 个 data.frame 会是什么样子吗?鉴于您的示例数据,您能否编辑您的帖子并包含最终的数据集?那会很有帮助。
-
@Ben 我为 var1 添加了示例列。让我知道这是否有意义。基本上,mean_var1 = mean(var1), by(year) 所以在给定年份的所有国家/地区都是相同的。那么 relmean_var1 是该国家相对于总体平均值的值 (var1/mean_var1),因此每个国家/地区的年份都采用不同的值。将对所有变量进行此计算。
-
皮埃尔,您的第一张表看起来很适合输入。 @Ben 要求您为 expected 数据集制作第二个类似的表格。有几种方法可以解释您的请求,但显示所需的输出会确定它。
-
另外,对于未来的请求,使用代码定义您的输入数据集。请参阅下面@danloo 的回复,了解一种方法。
-
嗨@wibeasley,感谢您的回复。以后我会使用danloos格式。最终数据集应该看起来像第一个数据集,其中有 8 个附加列,分别代表 mean_var1、...、mean_var4、...; relmean_var1,relmean_var4。让我看看是否可以将其作为两个数据框发布,如果这样会更清楚
标签: r dplyr nested-loops purrr mutation