在R中按团队归属拆分CSV列并分类填充的技术问询
解决方案
先纠正个小笔误:你定义的teamb_b应该是team_b吧?下面代码里我会用正确的变量名。
直接上实操代码,一步步解决你的需求:
1. 读入数据并预处理
假设你的CSV文件叫data.csv,先读入数据,再把D列的分号分隔名字拆成列表格式(比separate更适合处理每行数量不定的元素):
library(dplyr) library(stringr) # 读入CSV数据 df <- read.csv("data.csv", stringsAsFactors = FALSE) # 拆分D列的名字,得到每行对应一个名字向量的列表列 df <- df %>% mutate(names_list = str_split(D, ";\\s*")) # 匹配分号+可选空格,避免拆分后名字带多余空格
2. 统一管理团队成员
把三个团队整合成一个列表,后续处理更简洁:
teams <- list( team_a = c('John', 'Tim'), team_b = c('David', 'Jack'), team_c = c('Sue', 'Frank', 'Jane') )
3. 新增团队列并填充对应成员
用交集匹配提取每行属于对应团队的名字,再拼接成字符串:
df <- df %>% mutate( team_a = map_chr(names_list, ~str_c(intersect(.x, teams$team_a), collapse = "; ")), team_b = map_chr(names_list, ~str_c(intersect(.x, teams$team_b), collapse = "; ")), team_c = map_chr(names_list, ~str_c(intersect(.x, teams$team_c), collapse = "; ")) )
解释:intersect用来筛选出每行名字中属于对应团队的成员,str_c把这些成员用分号拼接成字符串;如果没有匹配成员,对应列会显示空字符串。
4. 统计每行各团队人数
直接从拆分后的名字列表里统计对应团队的人数:
df <- df %>% mutate( count_team_a = map_int(names_list, ~sum(.x %in% teams$team_a)), count_team_b = map_int(names_list, ~sum(.x %in% teams$team_b)), count_team_c = map_int(names_list, ~sum(.x %in% teams$team_c)) )
解释:%in%判断每个名字是否属于对应团队,sum统计符合条件的数量(TRUE会被识别为1,FALSE为0)。
示例效果
以你给出的几行数据为例:
- 第1行D列
John; Tim; David; Jack:team_a列显示John; Tim,count_team_a为2;team_b列显示David; Jack,count_team_b为2;team_c列空,count_team_c为0 - 第2行D列
Tim:team_a列显示Tim,count_team_a为1;其余团队列空,计数为0 - 第3行D列
Jack; David; Sue:team_b列显示Jack; David,count_team_b为2;team_c列显示Sue,count_team_c为1;team_a列空,计数为0
内容的提问来源于stack exchange,提问作者SMK123
相关产品推荐
相关产品推荐

