R 跨多个变量复制分组函数以生成许多新变量
我有一个包含10个变量的大数据框,每个变量都分配了一个组。下面是一个示例数据帧R 跨多个变量复制分组函数以生成许多新变量,r,dplyr,R,Dplyr,我有一个包含10个变量的大数据框,每个变量都分配了一个组。下面是一个示例数据帧 test <- data.frame(1:10) test$ID <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J") test$Zone1 <-
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)
test这里有一种方法:
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)
}
我们使用sym
和在cols
中传递字符变量代码>我们将它们作为列值进行评估,以便在函数中使用。非常感谢您的支持。我在网上看了一下,但是我找不到关于什么的解释!!用r表示。意义是什么?所以cols
是字符值。当我们使用sym
时,它会将字符转换为符号,现在为了让R了解这些是实际的列值,我们需要使用对其进行评估因此,这些字符现在被视为数据帧的列。更多的解释和例子可以在?“!!”
上找到,我最初的帖子没有说明一个组只有行的情况(因此是NA的标准偏差)。这是通过更新代码以包括以下转换(!!paste0(col,'.'u new'):=if(sd(!!sym(col))!=0&!is.na(sd(!!sym(col)))来解释的。在应用sd
之前,我还更新了答案以检查长度。
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)
}
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