如何将逗号分隔变量拆分后按值匹配生成有序dataframe
解决方案
该需求可实现。cSplit无法得到预期结果的原因是其默认按字符串拆分后的先后顺序从左到右填充列,属于位置匹配逻辑,和需求要求的「每列绑定固定事件值、与原字符串拆分顺序无关」的逻辑不匹配。
实现逻辑非常直接:先确定每个列对应的固定事件值,逐行判断该事件值是否存在于当前行的拆分结果中,存在则在对应列填入该事件值,不存在填NA即可。
方法1:tidyverse 实现
# 加载依赖 library(dplyr) library(stringr) # 构造示例原始数据 df <- data.frame( Events = c("A,B,C", "C,D", "B,A", "D,B,A,E", "A,E,B") ) # 配置列和事件值的固定映射 event_map <- c( Event1 = "A", Event2 = "B", Event3 = "C", Event4 = "D", Event5 = "E" ) # 执行转换 df_result <- df %>% mutate(split_res = strsplit(Events, ",")) %>% mutate( across(all_of(names(event_map)), ~ ifelse(event_map[cur_column()] %in% unlist(split_res), event_map[cur_column()], NA_character_)) ) %>% select(-split_res)
运行后输出完全匹配预期结构:
Events Event1 Event2 Event3 Event4 Event5 1 A,B,C A B C <NA> <NA> 2 C,D <NA> <NA> C D <NA> 3 B,A A B <NA> <NA> <NA> 4 D,B,A,E A B <NA> D E 5 A,E,B A B <NA> <NA> E
方法2:Base R 实现(无第三方依赖)
# 配置列与事件值的对应关系 col_names <- c("Event1", "Event2", "Event3", "Event4", "Event5") match_events <- c("A", "B", "C", "D", "E") # 拆分原始字符串 split_list <- strsplit(df$Events, ",") # 逐列生成结果 df_base <- as.data.frame( lapply(match_events, \(ev){ sapply(split_list, \(row) ifelse(ev %in% row, ev, NA_character_)) }) ) colnames(df_base) <- col_names df_base <- cbind(df["Events"], df_base)
内容的提问来源于stack exchange,提问作者Kevin Santos
相关产品推荐
相关产品推荐

