У меня есть список фреймов данных, каждый из которых содержит несколько переменных, которые содержат значения площади поверхности (оканчивающиеся на «_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")
Я знаю, как это сделать с помощью al oop, но хотел бы понять, как это можно сделать в логике tidyverse / dplyr c , Мой l oop (который дает мне желаемый результат) выглядит следующим образом:
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, но мой подход не работает. Если я правильно понимаю, это потому, что моя среда является вложенной, и я не могу получить доступ к x в функции, которая вычисляет переменную "ha".
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 для доступа к переменная из родительского фрейма данных на основе имени начальной переменной в функции?
Я, конечно, был бы рад любому другому предложению о подходе по принципу Tidyverse для вычисления переменных "_ha" на основе динамических c имен переменных.