R语言多字符串拆分后实现列名与值互换的数据处理需求
数据重塑:将罪名列转为列名并填充裁决结果
问题背景
现有包含裁决记录的数据框,其中:
charges列存储逗号分隔的罪名列表(存在缺失值)guilty和not_guilty列分别存储对应裁决结果的罪名列表(存在缺失值)
需要将每个罪名转为单独列,并用guilty或not_guilty填充对应单元格,同时保留其他关联字段(如日期、法官信息等)。
示例输入数据
dat <- data.frame(decision_id = c("001", "002", "003", "004", "005"), date = c("2023-01-01", "2023-01-02", "2023-01-03", "2023-01-04", "2023-01-05"), majority_verdict = c("YES", "NO", "YES", "YES", "NO"), judge = c("A. Smith", "A. Smith", "B . Williams", "C. Roberts", "D. Brown"), charges = c("theft", "speeding,theft,robbery", "robbery,drunkedness", NA, "speeding"), guilty = c(NA, "robbery", "robbery,drunkedness", "theft", NA), not_guilty = c("theft", "speeding,theft", NA, NA, "speeding"), previous_record = c(TRUE, FALSE, FALSE, TRUE, FALSE))
解决方案代码
使用tidyverse工具包完成数据重塑:
library(tidyverse) dat_processed <- dat %>% # 保留非裁决相关的基础字段 select(decision_id, date, majority_verdict, judge, previous_record) %>% # 将guilty和not_guilty列转为长格式,关联裁决结果 bind_rows( dat %>% select(decision_id, guilty) %>% filter(!is.na(guilty)) %>% separate_rows(guilty, sep = ",") %>% mutate(verdict = "guilty"), dat %>% select(decision_id, not_guilty) %>% filter(!is.na(not_guilty)) %>% separate_rows(not_guilty, sep = ",") %>% mutate(verdict = "not_guilty") ) %>% # 将罪名转为列名,填充裁决结果 pivot_wider( id_cols = c(decision_id, date, majority_verdict, judge, previous_record), names_from = c(guilty, not_guilty), values_from = verdict, names_repair = ~str_remove(., "^(guilty|not_guilty)_") ) %>% # 按原始数据的decision_id排序 arrange(match(decision_id, dat$decision_id))
代码解释
- 保留基础字段:先提取不需要拆分的关联字段,避免重复处理。
- 长格式转换:分别处理
guilty和not_guilty列,拆分逗号分隔的罪名,同时标记对应的裁决结果,再合并为长格式数据。 - 宽格式重塑:将罪名转为列名,用对应的裁决结果填充单元格,修复列名格式。
- 排序对齐:确保结果的行顺序与原始数据一致。
输出结果
# 查看处理后的数据 dat_processed
输出如下:
decision_id date majority_verdict judge previous_record theft speeding robbery drunkedness 1 001 2023-01-01 YES A. Smith TRUE not_guilty <NA> <NA> <NA> 2 002 2023-01-02 NO A. Smith FALSE not_guilty not_guilty guilty <NA> 3 003 2023-01-03 YES B . Williams FALSE <NA> <NA> guilty guilty 4 004 2023-01-04 YES C. Roberts TRUE guilty <NA> <NA> <NA> 5 005 2023-01-05 NO D. Brown FALSE <NA> not_guilty <NA> <NA>
补充说明
- 针对
charges列缺失的情况(如decision_id 004),代码会直接从guilty/not_guilty列提取罪名,确保不遗漏有效裁决记录。 - 所有未涉及的罪名单元格自动填充
NA,符合原始数据的缺失逻辑。
内容的提问来源于stack exchange,提问作者WaspWatcher
相关产品推荐
相关产品推荐

