簡體   English   中英

R 列表到數據框的列表,列表名稱作為額外的列

[英]R List of lists to dataframe with list name as extra column

我有一個包含名稱的列表列表。

我想將它們全部添加到一個數據框中,但保留所有列

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

這可能有效

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

它使用map_df ,它將映射列表並將結果轉換為數據框(如果可能)。 使用.id參數將names作為列添加到每個數據框。

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

您也可以使用rbinddo.call在基礎 R 中執行此操作:

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)

但是,您的數據框似乎沒有 column names 我認為你需要解決這個問題,這兩種解決方案才能工作。

@mikeck 走在正確的軌道上。 使用. 是棘手的. 正則表達式匹配任何字符。 所以我們需要在.之前轉義字符\\ . . 對於任何想要使用基礎 R 完成此操作的人,您可以嘗試以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM