R语言:按规则匹配字符串并为数据集添加指定列名
解决方案
以下提供两种可行的实现方法,分别基于tidyverse(dplyr)和基础R,均能满足你的需求:
方法一:使用tidyverse工具包
先加载所需包,再按步骤处理:
library(dplyr) library(stringr) # 1. 从code_book中提取目标列名 # 提取以Overarching开头的列名 overarch_cols <- code_book %>% filter(str_detect(`New Variable`, "^Overarching")) %>% pull(`New Variable`) # 提取以Breakfast开头的列名 breakfast_cols <- code_book %>% filter(str_detect(`New Variable`, "^Breakfast")) %>% pull(`New Variable`) # 定义需要保留/添加的固定列 fixed_cols <- c("ID", "Start", "Complete", "IPAddress", "FirstName", "NumID", "Organization") # 2. 处理data_process数据集 data_process <- data_process %>% # 补充缺失的固定列(值设为NA,需设0可替换) add_column(!!!set_names(rep(list(NA), length(setdiff(fixed_cols, colnames(data_process)))), setdiff(fixed_cols, colnames(data_process))), .before = 1) %>% # 补充缺失的Overarching类列(值设为NA,需设0可替换) add_column(!!!set_names(rep(list(NA), length(setdiff(overarch_cols, colnames(data_process)))), setdiff(overarch_cols, colnames(data_process)))) %>% # 补充缺失的Breakfast类列(值设为NA,需设0可替换) add_column(!!!set_names(rep(list(NA), length(setdiff(breakfast_cols, colnames(data_process)))), setdiff(breakfast_cols, colnames(data_process))))
方法二:使用基础R(无需额外包)
如果不想加载第三方包,可直接用基础R实现:
# 1. 从code_book中提取目标列名 overarch_cols <- subset(code_book, grepl("^Overarching", `New Variable`))$`New Variable` breakfast_cols <- subset(code_book, grepl("^Breakfast", `New Variable`))$`New Variable` fixed_cols <- c("ID", "Start", "Complete", "IPAddress", "FirstName", "NumID", "Organization") # 2. 补充缺失的固定列 missing_fixed <- setdiff(fixed_cols, colnames(data_process)) if(length(missing_fixed) > 0){ data_process[missing_fixed] <- NA # 替换为0可改为 data_process[missing_fixed] <- 0 } # 3. 补充缺失的Overarching类列 missing_overarch <- setdiff(overarch_cols, colnames(data_process)) if(length(missing_overarch) > 0){ data_process[missing_overarch] <- NA } # 4. 补充缺失的Breakfast类列 missing_breakfast <- setdiff(breakfast_cols, colnames(data_process)) if(length(missing_breakfast) > 0){ data_process[missing_breakfast] <- NA }
关键说明
- 列名匹配:代码中使用
^确保只匹配以指定字符串开头的列名,如果需要忽略大小写(比如匹配overarching小写开头),可在str_detect中添加ignore.case=TRUE,或在grepl中设置ignore.case=TRUE。 - 值的设置:默认将新增列的值设为
NA,如果需要设为0,直接将代码中的NA替换为0即可。 - 保留现有列:两种方法都会检查数据集已有的列,只添加缺失的目标列,不会覆盖原有列的数据。
内容的提问来源于stack exchange,提问作者Humberto R
相关产品推荐
相关产品推荐

