如何在R中基于部分字符串匹配替换虚拟变量列名?
解决方案
方法一:基础R实现
先生成虚拟列,再通过自定义函数批量修改列名:
library(fastDummies) # 创建原始数据并生成虚拟列 df <- data.frame(period = c(-3, -2, -1, 0, 1, 2, 3)) df <- dummy_cols(df, select_columns = "period") # 批量重命名虚拟列 colnames(df) <- sapply(colnames(df), function(col) { if (col == "period") return(col) # 提取period_后的数值部分 val <- sub("period_", "", col) if (val == "0") { "event" } else if (as.integer(val) < 0) { paste0("lag", abs(as.integer(val))) } else { paste0("lead", val) } }) # 输出结果 df
方法二:tidyverse(dplyr)实现
结合rename_with和case_when更简洁地完成重命名:
library(fastDummies) library(dplyr) library(stringr) df <- data.frame(period = c(-3, -2, -1, 0, 1, 2, 3)) %>% dummy_cols(select_columns = "period") %>% rename_with( .cols = starts_with("period_"), .fn = function(col) { val <- str_remove(col, "period_") case_when( val == "0" ~ "event", as.integer(val) < 0 ~ paste0("lag", abs(as.integer(val))), TRUE ~ paste0("lead", val) ) } ) # 输出结果 df
最终输出
period lag1 lag2 lag3 event lead1 lead2 lead3 1 -3 0 0 1 0 0 0 0 2 -2 0 1 0 0 0 0 0 3 -1 1 0 0 0 0 0 0 4 0 0 0 0 1 0 0 0 5 1 0 0 0 0 1 0 0 6 2 0 0 0 0 0 1 0 7 3 0 0 0 0 0 0 1
内容的提问来源于stack exchange,提问作者aerw4
相关产品推荐
相关产品推荐

