如何分解由列表列表组成的数据框

Posted

技术标签:

【中文标题】如何分解由列表列表组成的数据框【英文标题】:How to disaggregate a data frame consisting of list of lists 【发布时间】:2017-12-23 16:18:02 【问题描述】:

如果我构造一个数据框为

# constructing df
a <- c(rep("A", 3), rep("B", 3), rep("A",2))
b <- c(1,1,2,4,1,1,2,2)
#c <- c("ir", "ir", "br", "ir", "us", "us", "ir", "br")
c <- c(1, 2, 3, 4, 4, 4, 4, 5)
df <- data.frame(a,b,c)

我可以通过以下方式汇总:

df_red <- aggregate(list(track = c), df[,c("a", "b")], '[')

将其分解回以前的最佳方式是什么?

换句话说,我该如何转换:

  a b   track
1 A 1    1, 2
2 B 1    4, 4
3 A 2 3, 4, 5
4 B 4       4

到这里:

  a b c
1 A 1 1
2 A 1 2
3 A 2 3
4 B 4 4
5 B 1 4
6 B 1 4
7 A 2 4
8 A 2 5

【问题讨论】:

在基础 R 中,您可以使用 cbind(df_red[rep(seq_along(df_red$track), lengths(df_red$track)), 1:2], track=unlist(df_red$track)) 试试library(tidyr);unnest(df_read) 【参考方案1】:

1) unnest 像这样尝试unnest

library(tidyr)

df_red %>% unnest

unnest(df_red)

2) 基础这是一个基础解决方案:

do.call(rbind, do.call(Map, c(data.frame, df_red)))

3) separate_rows 另请注意,如果您想聚合成一个字符串而不是一个向量,我们可以使用这一对:

library(tidyr)

ag_s <- aggregate(list(track = c), df[c("a", "b")], toString)

ag_s %>% separate_rows(track)

【讨论】:

以上是关于如何分解由列表列表组成的数据框的主要内容,如果未能解决你的问题,请参考以下文章

Python数据框将列表列分解为多行[重复]

如何用列表分解熊猫数据框以用相同的ID标记同一行中的那些?

根据每个句子的第一个单词将 pandas 数据框列中的字符串列表分解为新列

Pandas 将不同长度的列表分解成行

PySpark 根据名称将列表分解为多列

Sparklyr:如何将列表列分解为Spark表中自己的列?