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

R语言使用pivot_wider()与unnest()后数据行消失的问题求助

问题:长表转宽表后unnest丢失特定行且筛选失效

操作背景与异常情况

初始需求是将长格式数据框的question字段转为单独列,执行代码:

df_new <- pivot_wider(df_old,
                  names_from = question,
                  values_from = answer) %>% clean_names()

得到含嵌套列表的宽表后,执行以下代码展开嵌套:

df_new <- df_new %>% unnest(c(question_1)) %>% unnest(c(question_2)) %>% unnest(c(question_3))

出现异常:

  • case_id为789的行完全消失,仅保留123和456的数据
  • 使用filter(str_detect(case_id, "789") == TRUE)筛选返回空数据框,但通过索引df_new[5:6,]能正常选取该行
  • 所有数据类型均为字符型,无报错信息

附上df_old和df_new的dput结构,寻求问题原因与解决方法。

原因分析

  1. case_id存在不可见字符:比如首尾空格、全角空格、换行符或其他控制字符,导致字符串匹配逻辑失效,但索引选取不受字符内容影响。
  2. unnest默认行为过滤空列表行:如果case_id=789对应的某个question_*列的嵌套列表为空,unnest默认参数keep_empty = FALSE会自动丢弃这类行。

解决方法

1. 排查并清理case_id的异常字符

执行以下代码查看case_id的原始字符编码和长度,确认是否存在不可见字符:

df_new %>% 
  mutate(
    case_id_raw = charToRaw(case_id),
    case_id_length = nchar(case_id)
  ) %>% 
  print(n = Inf)

如果发现异常字符,执行清理:

# 去除首尾空格
df_new <- df_new %>% mutate(case_id = str_trim(case_id))

# 或者仅保留数字字符
df_new <- df_new %>% mutate(case_id = str_remove_all(case_id, "[^0-9]"))

2. 修改unnest参数保留空列表行

在unnest时添加keep_empty = TRUE,确保即使嵌套列表为空也保留对应行:

df_new <- df_new %>% 
  unnest(c(question_1), keep_empty = TRUE) %>% 
  unnest(c(question_2), keep_empty = TRUE) %>% 
  unnest(c(question_3), keep_empty = TRUE)

3. 验证修复效果

执行筛选代码确认是否能正常匹配:

df_new %>% filter(case_id == "789")

内容的提问来源于stack exchange,提问作者jinkx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 03:36:22