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)
新函数