将列表的列表转换为数据框,并将列表名称作为额外列。

15

我有一个包含名称的列表列表。

我想将它们全部合并成一个数据框,但保留所有列。


past_earnings_lists[1]

成功从列表中的列表返回一个列表

names(past_earnings_lists)[1]

成功返回列表名称

past_earnings <- melt(past_earnings_lists)

将所有数据放在一个数据框中,但不保留结构。

past_earnings <- as.data.frame.matrix(past_earnings_lists$ADBE)

成功地接受一个列表并保留其结构,但不会将列表名称添加到数据框中。

例如,adbe有7列和30行; 我希望它添加第8列名称为adbe,并将其附加到包含所有其他列表的数据框中。

structure

I want a dataframe with the results being:
  sym  v1 v2 v3 v4 v5 v6 v7
1 adbe  1  2  3  4  5  6  7
2 adbe  1  2  3  4  5  6  7
3 air   1  2  3  4  5  6  7
4 air   1  2  3  4  5  6  7
5 alog  1  2  3  4  5  6  7
and so on

7
没有可重复的示例,这是行不通的。 - B Williams
1
虽然没有提供数据结构以使其成为可重现的示例,但同意您很难找到帮助,但您可能会发现dplyr中的bind_rows函数有用,使用.id参数来连接列表并生成一个新变量来标识列表的名称。http://dplyr.tidyverse.org/reference/bind.html - dshkol
已经添加了一张截图。 - Bryanzpope
还不清楚。你有一个列表,还是一个列表的列表?能否包含 past_earnings_liststrdput 输出? - mikeck
请注意,执行 mylist[1] 返回一个子列表,而 mylist[[1]] 返回元素本身(参见双括号)。 - mikeck
3个回答

39

这可能会起作用

library(purrr)
ans <- map_df(past_earnings_lists, ~as.data.frame(.x), .id="id")

它使用map_df,该函数将遍历列表并将结果转换为数据框(如果可能)。使用.id参数将names添加到每个数据框作为一列。


太好了:)!但是我怎么才能将它恢复呢? - Lenn
你是什么意思? - CPak

5

正如@dshkol评论的那样,最简单的方法是使用dplyr::bind_rows

d = data.frame(letter = LETTERS, number = 1:26)
d.list = list(d1 = d, d2 = d)
d.all = dplyr::bind_rows(d.list, .id = "variable")

您也可以使用基本R中的rbinddo.call来完成此操作:

d.all = do.call(rbind, d.list)

然而,这样并不能得到包含列表名称的列。不过你可以从row.names中解析出来:
d.all["variable"] = unlist(lapply(
  strsplit(row.names(d.all), ".", fixed = TRUE), function(x) x[[1]])
)

或者,遍历你的数据框并在绑定之前手动添加标签:

for (n in names(d.list))
  d.list[[n]]['name'] = n
d.all = do.call(rbind, d.list)

然而,看起来你的数据框没有列名。我认为你需要修复这个问题,才能让任何解决方案都能正常工作。


似乎不起作用,我添加了更多关于所需输出的信息。 - Bryanzpope

2

@mikeck的方法是正确的。使用 . 来拆分字符串是有技巧的,因为 . 正则表达式匹配任何字符。所以我们需要在 . 之前加上转义字符 \ 。如果有人想用基本R来实现这个功能,可以尝试这个方法:

df <- do.call(rbind, list)
df$listname <- lapply(strsplit(row.names(df), "\\."), '[[', 1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接