Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 跨多个变量复制分组函数以生成许多新变量_R_Dplyr - Fatal编程技术网

R 跨多个变量复制分组函数以生成许多新变量

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 <-

我有一个包含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)

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