R语言如何拆分多列嵌套列表实现行展开(避免全组合)
解决方法
你可以通过以下几种方式实现多列列表的位置对应式拆分,避免生成笛卡尔积:
方法1:使用tidyr的unnest_longer(推荐)
unnest_longer专门用于将列表列按元素展开,且当连续对多列使用时,会自动保持各列元素的位置对应关系(前提是每行的各列表列长度一致):
library(tidyverse) # 加载数据 df <- data.frame(id = c("123456", "234567", "345678")) df$date <- list(c("010122", "020222"), c("030322", "040422"), c("050522", "060622")) df$street = list(c("A Street", "B Street"), c("C Street", "D Street"), c("E Street", "F Street")) df$nr = list(c("1", "2"), c("1", "2"), c("1", "2")) # 拆分多列 result <- df %>% unnest_longer(date) %>% unnest_longer(street) %>% unnest_longer(nr) print(result)
运行后会得到你需要的6行结果,各列元素一一对应。
方法2:使用purrr的pmap批量生成小数据框
通过pmap遍历每一行,将该行的id与各列表元素组合成小数据框,最后合并所有小数据框:
library(purrr) library(dplyr) result <- df %>% pmap(function(id, date, street, nr) { tibble(id = id, date = date, street = street, nr = nr) }) %>% bind_rows()
方法3:修正separate_rows的用法
你之前用separate_rows生成笛卡尔积,是因为没有针对列表列设置正确参数。对列表列使用separate_rows时,需指定sep = NULL,这样会按列表元素拆分并保持多列的位置对应:
library(tidyr) result <- df %>% separate_rows(date, street, nr, sep = NULL)
内容的提问来源于stack exchange,提问作者Steffen Rask
相关产品推荐
相关产品推荐

