You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))

代码解释

  1. 保留基础字段:先提取不需要拆分的关联字段,避免重复处理。
  2. 长格式转换:分别处理guilty和not_guilty列,拆分逗号分隔的罪名,同时标记对应的裁决结果,再合并为长格式数据。
  3. 宽格式重塑:将罪名转为列名,用对应的裁决结果填充单元格,修复列名格式。
  4. 排序对齐:确保结果的行顺序与原始数据一致。

输出结果

# 查看处理后的数据
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 13:29:58