如何同时对多列执行unnest_longer或等价操作实现R tibble长表转换
多列表列同时展开实现tibble长格式转换
问题原因
你连续两次单独调用unnest_longer会触发笛卡尔积展开:第一次展开sequence后,每个seed会生成和序列长度一致的行数;第二次单独展开step_index时,已生成的每一行都会再匹配该seed下所有的step_index值,最终行数变为两个列表长度的乘积,就出现了大量重复数据,后续的pivot_longer属于多余操作,也没有解决核心的笛卡尔积问题。
正确解法
tidyr的unnest原生支持同时传入多个列表列,同一行的多个列表元素会按位置一一对应展开,刚好适配你这里sequence和step_index长度严格匹配的场景,代码如下:
library(tidyverse) collatz_sequences <- collatz_data %>% # 保留需要的字段 select(seed, sequence, step_index) %>% # 同时展开两个列表列,按位置一一匹配,不会生成笛卡尔积 unnest(cols = c(sequence, step_index)) %>% # 重命名为目标字段名 rename(values = sequence) %>% # 按种子和步长排序 arrange(seed, step_index)
运行后就会得到你需要的三列长表,没有重复值,可以直接传入ggplot绘图。
内容的提问来源于stack exchange,提问作者phileasdg
相关产品推荐
相关产品推荐

