阻止mutate截断长ifelse条件列名?批量列名设置方案
解决方法
方案1:用表达式列表注入,统一重命名
先把所有条件定义成表达式列表,再用!!!注入到mutate中,每个条件会生成独立列(默认列名为V1、V2...无重复),之后统一修改列名即可。
library(dplyr) # 生成原始数据 df <- data.frame(a = rnorm(20, 100, 1), b = rnorm(20, 100, 1), c = rnorm(20, 100, 1) ) # 定义所有条件为表达式列表 conditions <- list( # 条件1 expr(ifelse((lag(a, 1) - lag(c, 1)) < (lag(a, 2) - lag(b, 2)) & (lag(a, 1) - lag(c, 1)) < (lag(a, 3) - lag(b, 3)) & (lag(a, 1) - lag(c, 1)) < (lag(a, 4) - lag(b, 4)), 1, 0)), # 条件2 expr(ifelse((lag(a, 1) - lag(c, 1)) < (lag(a, 2) - lag(b, 2)) & (lag(a, 1) - lag(c, 1)) < (lag(a, 3) - lag(b, 3)) & (lag(a, 1) - lag(c, 1)) < (lag(a, 4) - lag(b, 4)) & (lag(a, 1) - lag(c, 1)) < (lag(a, 5) - lag(b, 5)) & (lag(a, 1) - lag(c, 1)) < (lag(a, 6) - lag(b, 6)), 1, 0)), # 条件3 expr(ifelse(a < b, 1, 0)) ) # 生成新数据框 df2 <- df %>% mutate(!!!conditions, .keep = 'none') # 统一设置列名 c_names <- paste('df', seq_len(ncol(df2)), sep = '') colnames(df2) <- c_names
方案2:命名列表一步到位(更高效)
把条件和对应列名绑定成命名列表,注入mutate后直接生成目标列名,无需后续修改,更适合批量维护。
library(dplyr) df <- data.frame(a = rnorm(20, 100, 1), b = rnorm(20, 100, 1), c = rnorm(20, 100, 1) ) # 定义列名 condition_names <- paste('df', 1:3, sep = '') # 绑定条件与列名 conditions <- setNames( list( expr(ifelse((lag(a, 1) - lag(c, 1)) < (lag(a, 2) - lag(b, 2)) & (lag(a, 1) - lag(c, 1)) < (lag(a, 3) - lag(b, 3)) & (lag(a, 1) - lag(c, 1)) < (lag(a, 4) - lag(b, 4)), 1, 0)), expr(ifelse((lag(a, 1) - lag(c, 1)) < (lag(a, 2) - lag(b, 2)) & (lag(a, 1) - lag(c, 1)) < (lag(a, 3) - lag(b, 3)) & (lag(a, 1) - lag(c, 1)) < (lag(a, 4) - lag(b, 4)) & (lag(a, 1) - lag(c, 1)) < (lag(a, 5) - lag(b, 5)) & (lag(a, 1) - lag(c, 1)) < (lag(a, 6) - lag(b, 6)), 1, 0)), expr(ifelse(a < b, 1, 0)) ), condition_names ) # 直接生成带目标列名的数据框 df2 <- df %>% mutate(!!!conditions, .keep = 'none')
问题根源
未命名的长ifelse表达式会被dplyr自动用表达式的字符串片段作为列名,长表达式截断后可能出现重复列名,导致后续列被覆盖或合并。用列表注入的方式能确保每个条件生成独立的、列名唯一的列,彻底解决这个问题。
内容的提问来源于stack exchange,提问作者ThallyHo
相关产品推荐
相关产品推荐

