R列表到数据框的列表,列表名称作为额外列
R List of lists to dataframe with list name as extra column
我有一个包含名称的列表。
我想将它们全部添加到一个数据框中,但保留所有列
past_earnings_lists[1]
成功returns列表列表中的一个列表
names(past_earnings_lists)[1]
成功returns列表名称
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
正如@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
:
在 base 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)
但是,您的数据框似乎没有列名。我认为您需要解决该问题才能使任一解决方案都起作用。
这可能有效
library(purrr)
ans <- map_df(past_earnings_lists, ~as.data.frame(.x), .id="id")
它使用 map_df
,它将映射列表并将结果转换为数据帧(如果可能)。使用 .id
参数将 names
作为列添加到每个数据框。
@mikeck 走对了路。使用 .
拆分字符串很棘手,因为 .
正则表达式匹配任何字符。所以我们需要在 .
之前转义字符 \
。对于任何想用 base R 完成这个的人,你可以试试这个:
df <- do.call(rbind, list)
df$listname <- lapply(strsplit(row.names(df), "\."), '[[', 1)
我有一个包含名称的列表。
我想将它们全部添加到一个数据框中,但保留所有列
past_earnings_lists[1]
成功returns列表列表中的一个列表
names(past_earnings_lists)[1]
成功returns列表名称
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
正如@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
:
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)
但是,您的数据框似乎没有列名。我认为您需要解决该问题才能使任一解决方案都起作用。
这可能有效
library(purrr)
ans <- map_df(past_earnings_lists, ~as.data.frame(.x), .id="id")
它使用 map_df
,它将映射列表并将结果转换为数据帧(如果可能)。使用 .id
参数将 names
作为列添加到每个数据框。
@mikeck 走对了路。使用 .
拆分字符串很棘手,因为 .
正则表达式匹配任何字符。所以我们需要在 .
之前转义字符 \
。对于任何想用 base R 完成这个的人,你可以试试这个:
df <- do.call(rbind, list)
df$listname <- lapply(strsplit(row.names(df), "\."), '[[', 1)