R列表到数据框的列表,列表名称为额外列

时间:2017-09-19 21:53:31

标签: r reshape2

我有一个名单列表。

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

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列,并将其附加到数据框,其他所有列表都相同。

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

3 个答案:

答案 0 :(得分:5)

这可能有效

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

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

答案 1 :(得分:1)

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

但是,您的数据框看起来没有列名。我认为你需要解决这个问题才能解决问题。

答案 2 :(得分:1)

@mikeck正确。使用.分割字符串很麻烦,因为.正则表达式可以匹配任何字符。因此我们需要在\之前使用转义字符.。对于任何想以R为基数的人,您可以尝试以下方法:

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