[英]Replicating a grouped function across multiple variables to generate many new variables
我有一个包含 10 个变量的大型数据框,每个变量都被分配了一个组。 下面是一个示例数据框。
test <- data.frame(1:10)
test$ID <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
test$Zone1 <- c(1,1,1,2,3,2,5,6,4,1)
test$Zone2 <- c(1,2,1,2,2,2,4,8,6,1)
test$Zone3 <- c(1,1,1,2,2,2,3,3,3,1)
test$Zone1_group<- c(1,1,1,2,2,2,3,3,3,4)
test$Zone2_group<- c(1,1,1,2,2,2,3,3,3,4)
test$Zone3_group<- c(1,1,1,2,2,2,3,3,3,4)
我想确定给定变量的组是否有任何差异。 如果一个组没有任何差异,我会用 NA 替换它的值。 下面是所需的 output 我能够使用以下方法在 dplyr 中为一个变量(如果我排除 Zone1_group ==4)实现:
test2 <- test %>% group_by(Zone1_group) %>% summarise(Zone1_variance = SD(Zone1))
test3 <- left_join(test, test2, by = "Zone1_group")
test3 %>% mutate(Zone1_new = if_else(Zone1_variance == 0, NA_real_, Zone1))
X1.9 ID Zone1 Zone2 Zone3 Zone1_group Zone2_group Zone3_group Zone1_variance Zone1_new
1 1 A 1 1 1 1 1 1 0.0000000 NA
2 2 B 1 2 1 1 1 1 0.0000000 NA
3 3 C 1 1 1 1 1 1 0.0000000 NA
4 4 D 2 2 2 2 2 2 0.5773503 2
5 5 E 3 2 2 2 2 2 0.5773503 3
6 6 F 2 2 2 2 2 2 0.5773503 2
7 7 G 5 4 3 3 3 3 1.0000000 5
8 8 H 6 8 3 3 3 3 1.0000000 6
9 9 I 4 6 3 3 3 3 1.0000000 4
由于我需要为 10 个变量复制此过程(和其他类似过程),我想知道是否有一种方法可以比复制、粘贴和更新每个变量名称更优雅地做到这一点?
这是执行此操作的一种方法:
library(dplyr)
library(purrr)
library(rlang)
add_new_var_cols <- function(data, col) {
group_col <- paste0(col, '_group')
col1 <- sym(col)
data %>%
group_by(!!sym(group_col)) %>%
transmute(!!paste0(col, '_new') := if(length(!!col1) > 1 &&
sd(!!col1) != 0) !!col1 else NA_real_) %>%
ungroup %>%
select(-group_col)
}
现在将此 function 应用于每个'Zone'
列:
cols <- paste0('Zone', 1:3)
bind_cols(test, map_dfc(cols, add_new_var_cols, data = test))
# X1.9 ID Zone1 Zone2 Zone3 Zone1_group Zone2_group Zone3_group Zone1_new Zone2_new Zone3_new
#1 1 A 1 1 1 1 1 1 NA 1 NA
#2 2 B 1 2 1 1 1 1 NA 2 NA
#3 3 C 1 1 1 1 1 1 NA 1 NA
#4 4 D 2 2 2 2 2 2 2 NA NA
#5 5 E 3 2 2 2 2 2 3 NA NA
#6 6 F 2 2 2 2 2 2 2 NA NA
#7 7 G 5 4 3 3 3 3 5 4 NA
#8 8 H 6 8 3 3 3 3 6 8 NA
#9 9 I 4 6 3 3 3 3 4 6 NA
我们在cols
中传递字符变量,使用sym
和!!
我们将它们评估为列值以在 function 中使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.