【发布时间】:2020-08-13 20:52:54
【问题描述】:
我有一个数据框列表,每个数据框都包含多个变量,这些变量包含表面积值(以“_area”结尾)。对于每个表面积变量,我想使用相应的转换因子(以“_unit”结尾)来计算包含标准测量单位面积的第三个变量。我希望这些变量以“_area_ha”结尾。
以下是我的示例数据框:
a <- tibble(a1_area = c(1,1,1), a2_area_unit = c(1,1,0.5), a2_area = c(1,1,1),
a1_area_unit = c(1,0.5,0.5), abc = c(1,2,3))
b <- tibble(b1_area = c(1,1,1), b1_area_unit = c(1,1,0.5), b2_area = c(1,1,1),
b2_area_unit = c(1,0.5,0.5), abc = c(1,2,3))
ab_list <- list(a, b)
names(ab_list) <- c("a", "b")
我知道如何在循环的帮助下做到这一点,但想了解如何在 tidyverse/dplyr 逻辑中做到这一点。我的循环(它给了我想要的输出)看起来像这样:
df_names <- names(ab_list)
for (d in df_names) {
df <- ab_list[[d]]
var_names <- names(select(df, matches("_area$")))
for (v in var_names) {
int <- df %>% select(all_of(v),)
int2 <- df %>% select(matches(paste0(names(int), "_unit")))
int3 <- int*int2
names(int3) <- paste0(names(int), "_ha")
df <- cbind(df, int3)
rm(int, int2, int3)
}
ab_list[[d]] <- tibble(df)
rm(df)
}
> ab_list
$`a`
# A tibble: 3 x 7
a1_area a2_area_unit a2_area a1_area_unit abc a1_area_ha a2_area_ha
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 1 1 1 1
2 1 1 1 0.5 2 0.5 1
3 1 0.5 1 0.5 3 0.5 0.5
$b
# A tibble: 3 x 7
b1_area b1_area_unit b2_area b2_area_unit abc b1_area_ha b2_area_ha
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 1 1 1 1
2 1 1 1 0.5 2 1 0.5
3 1 0.5 1 0.5 3 0.5 0.5
我尝试过使用 lapply 和 mutate_at,但我的方法不起作用。如果我理解正确,这是因为我的环境是嵌套的,我无法在计算变量“ha”的函数中访问 x。
ab_list %>%
lapply(function(x) mutate_at(x, vars(matches("_area$")), list(ha = ~.*x[[paste0(names(.),"_unit")]])))
Error: Column `a1_area_ha` must be length 3 (the number of rows) or one, not 0
有没有办法让 mutate_at 中的函数根据函数中初始变量的名称访问父数据框中的变量?
如果有任何其他关于基于动态变量名称计算“_ha”变量的 tidyverse 方法的建议,我当然会很高兴。
【问题讨论】: