使用tidyverse转换行列时保留有效重复数据的方法求助
解决方法
你当前的代码存在两个核心问题:
rownames_to_column()用法错误,这个函数的作用是给数据框添加一列存储原行名,而非将Agent设为行名;- R的行名必须唯一,直接把重复的Agent设为行名本身就不成立,这也是你触发报错的原因。
根据你“每个Agent仅显示一行、保留所有关联Job”的需求,这里提供两种实用方案:
方案1:将同一Agent的Job合并为单个字符串列
适合需要把所有关联Job集中在同一单元格展示的场景:
library(tidyverse) # 先清理数据:去除Agent字段的首尾空格(比如原数据里的"Agent C ") sample.df <- data.frame( Agent = c("Agent A", "Agent B", "Agent A", "Agent C ", "Agent B"), Job = c(1,1,2,2,3) ) %>% mutate(Agent = str_trim(Agent)) # 分组合并Job sample.df %>% group_by(Agent) %>% summarize(Assigned_Jobs = str_c("Job ", Job, collapse = ", "), .groups = "drop")
运行后输出结果:
# A tibble: 3 × 2 Agent Assigned_Jobs <chr> <chr> 1 Agent A Job 1, Job 2 2 Agent B Job 1, Job 3 3 Agent C Job 2
方案2:转换为宽格式(每个Job作为单独列)
如果需要用独立列区分不同Job,可以用pivot_wider,通过list保留每个Agent的所有关联Job,或给重复列加后缀:
# 用list格式保留每个Agent的所有Job sample.df %>% mutate(Job = str_c("Job ", Job)) %>% pivot_wider(names_from = Job, values_from = Job, values_fn = list, values_fill = NA) # 或给重复关联的Job列加序号后缀 sample.df %>% mutate(Job = str_c("Job ", Job), row_id = row_number(), .by = Agent) %>% # 按Agent生成组内行号 pivot_wider(names_from = c(Job, row_id), values_from = Job, values_fill = NA)
内容的提问来源于stack exchange,提问作者Jérôme Fortier
相关产品推荐
相关产品推荐

