R语言中pivot_wider后使用unnest()报错的解决方法
解决pivot_wider转宽格式时的unnest报错问题
问题原因
你遇到的报错是因为数据中存在同一个Cell_line+Gene组合对应多个AF值的情况,比如某行细胞系的MYC有4个AF值,KRAS只有2个。用values_fn = list会把这些值存成列表列,但unnest()要求每行所有列表的长度完全一致,否则就会触发"无法循环输入"的错误。
解决方案(分场景)
场景1:每个Cell_line-Gene组合应该只有一个值(数据存在重复)
如果是数据重复导致的多值,先去重再转宽:
df1 = df %>% distinct(Cell_line, Gene, .keep_all = TRUE) %>% pivot_wider(names_from = Gene, values_from = AF)
这样直接得到数值型列,不会生成列表,也不会丢失唯一的有效数据。
场景2:确实存在多值,需要保留所有数据
方案A:将多值合并为字符串
把同一个Cell_line-Gene下的多个AF值用分隔符合并,方便查看:
df1 = df %>% pivot_wider( names_from = Gene, values_from = AF, values_fn = ~paste(., collapse = ", ") )
结果示例:
Cell_line MYC KRAS COLO320 0.5, 0.6 0.4 H524 0.6 0.5, 0.7
方案B:保留列表列,按需处理
如果后续需要对多值做分析,直接保留列表列,不要强行unnest:
df1 = df %>% pivot_wider(names_from = Gene, values_from = AF, values_fn = list)
后续可以用unnest_wider()把单个基因的列表展开为多列:
df1 %>% unnest_wider(MYC, names_sep = "_")
会生成MYC_1、MYC_2等列,对应该基因的多个AF值。
方案C:给重复行加序号,转宽后保留所有值
给每个Cell_line-Gene的重复行添加序号,转宽后用序号区分多值:
df1 = df %>% group_by(Cell_line, Gene) %>% mutate(row_id = row_number()) %>% pivot_wider( names_from = Gene, values_from = AF, names_glue = "{Gene}_{row_id}" ) %>% ungroup()
结果示例:
Cell_line MYC_1 MYC_2 KRAS_1 COLO320 0.5 0.6 0.4 H524 0.6 NA 0.5
内容的提问来源于stack exchange,提问作者Jawad Alaa Edeen
相关产品推荐
相关产品推荐

