【问题标题】:R List of lists to dataframe with list name as extra columnR列表到数据框的列表,列表名称作为额外列
【发布时间】:2017-09-19 21:53:30
【问题描述】:

我有一个有名字的列表。

我想将它们全部添加到数据框中,但保留所有列

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 行;我希望它添加名称为 adbe 的第 8 列,并将其附加到数据框中,所有其他列表都执行相同操作。

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

【问题讨论】:

  • 如果没有可重复的示例,这将不会成功
  • 同意如果不提供数据结构以使其成为可重复的示例,您不太可能会找到帮助,但您可能会发现 dplyr 中的 bind_rows 函数有助于使用 .id 参数连接您的列表,同时生成一个标识列表名称的新变量。 dplyr.tidyverse.org/reference/bind.html
  • 那里,我添加了截图
  • 还不清楚。你有一个列表,还是一个列表列表?可以包含strdputpast_earnings_list 的输出吗?
  • 还要注意,mylist[1] 返回一个 sublist,而 mylist[[1]] 返回元素本身(见双括号)。

标签: r reshape2


【解决方案1】:

这可能有效

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

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

【讨论】:

  • 太好了:)!我怎样才能恢复这个呢?
  • 什么意思?
【解决方案2】:

正如@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)

但是,您的数据框看起来没有列名。我认为您需要解决这个问题才能使任何一种解决方案都能正常工作。

【讨论】:

  • 它似乎不起作用,添加了更多关于我想要什么输出的信息
【解决方案3】:

@mikeck 走在了正确的轨道上。使用. 拆分字符串很棘手,因为. 正则表达式匹配任何字符。所以我们在.之前需要转义字符\。对于任何想要使用基础 R 来完成此任务的人,您可以试试这个:

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

【讨论】:

    猜你喜欢
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2012-09-12
    • 1970-01-01
    • 2020-09-29
    • 2014-04-09
    相关资源
    最近更新 更多