[英]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")
您也可以使用rbind
和do.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.