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结构,寻求问题原因与解决方法。
原因分析
- case_id存在不可见字符:比如首尾空格、全角空格、换行符或其他控制字符,导致字符串匹配逻辑失效,但索引选取不受字符内容影响。
- 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
相关产品推荐
相关产品推荐

