Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.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_Mutate - Fatal编程技术网

R 当

R 当,r,dplyr,mutate,R,Dplyr,Mutate,我正在尝试对大型数据集进行变异,我想知道是否有更好的方法来运行此代码: library(dplyr) df <- data.frame(id = c('person 1', 'person 2'), a1 = c(0, 1), a2 = c(1, 0), a3 = c(0, 0), b1 = c(0, 1), b3 = c(1, 0)) new_function = function(name){ df %>% mutate( !!name := case_whe

我正在尝试对大型数据集进行变异,我想知道是否有更好的方法来运行此代码:

library(dplyr)

df <- data.frame(id = c('person 1', 'person 2'), a1 = c(0, 1), a2 = c(1, 0), a3 = c(0, 0), b1 = c(0, 1), b3 = c(1, 0))

new_function = function(name){
    df %>% mutate(
    !!name := case_when( 
    if(any(names(df) == paste0(name,'_1'))){ !!sym(paste0(name,'1')) == 1 ~ 1 },
    if(any(names(df) == paste0(name,'_2'))){ !!sym(paste0(name,'2')) == 1 ~ 2 },
    if(any(names(df) == paste0(name,'_3'))){ !!sym(paste0(name,'3')) == 1 ~ 3 },
    TRUE ~ 0)
    )
}

col_names = c('a', 'b')

col_names %>%
    map(new_function) 
问题是向量col_名称有100多个条目,我不确定缺少哪些列。在每个case_语句中扫描每个列名的整个数据帧似乎效率很低

我尝试使用albably()或safety()(不带if语句)忽略错误并继续运行代码,但它给出了与以前相同的错误


*注意每个人每个字母只能有一个“1”,因此只有一个case_when语句可以计算为TRUE。

因为我们知道每个人每个
col_名称只能有一个1,所以我们可以利用这个事实简化逻辑。我们可以选择以
col\u name
开头的列,使用
max.col
获取其中有1的列号,并通过从列名称中删除所有非数字数据返回值

library(dplyr)

new_function <- function(x) {
  temp <- df %>% select(starts_with(x))
   as.integer(gsub("\\D", "", names(temp)[max.col(temp)]))
}

bind_cols(df, purrr::map_dfc(col_names, new_function))

#        id a1 a2 a3 b1 b3 V1 V2
#1 person 1  0  1  0  0  1  2  3
#2 person 2  1  0  0  1  0  1  1
库(dplyr)

新函数因为我们知道每个人在每个
列名中只能有一个1,所以我们可以利用这一事实简化我们的逻辑。我们可以选择以
col\u names
开头的列,使用
max.col
获取包含1的列号,并通过删除列名中的所有非数字数据从列名返回值

library(dplyr)

new_function <- function(x) {
  temp <- df %>% select(starts_with(x))
   as.integer(gsub("\\D", "", names(temp)[max.col(temp)]))
}

bind_cols(df, purrr::map_dfc(col_names, new_function))

#        id a1 a2 a3 b1 b3 V1 V2
#1 person 1  0  1  0  0  1  2  3
#2 person 2  1  0  0  1  0  1  1
库(dplyr)
新函数