我有一个这样的清单:
$20
[1] 500
$30
[2] 600
我想将其转换为像这样的数据框
id values
20 500
30 600
答案 0 :(得分:3)
你可以这样做:
L <- list(`20`=500,`30`=600)
df <- data.frame(id=names(L), values=sapply(L, function(x) x[1]))
# > df
# id values
# 20 20 500
# 30 30 600
或者有点棘手:
df <- data.frame(id=names(L), values=sapply(L, '[', 1))
直到现在我才考虑更长的向量(并且只考虑第一个元素)。但在你的情况下(如果列表中的每个元素只是一个单元素的向量),一个较短的解决方案(对于评论来说是Abdou):
df <- data.frame(id = names(L), values = unlist(L))
答案 1 :(得分:1)
您可以使用do.call
解决问题:
li <- list(`20`=500,`30`=600)
df <- data.frame(Values = do.call("rbind",li))
df$Id <- rownames(df)
rownames(df) <- NULL
df <- df[,c(2,1)]
df
<强>输出:强>
> df
Id Values
1 20 500
2 30 600
答案 2 :(得分:0)
purrr的*_df
函数在列表上迭代函数并简化为data.frame。使用开发版本,您可以使用使用名称或索引作为第二个变量imap
的新.y
变体:
library(purrr)
l <- list(`25` = 900, `26` = 500)
l %>% imap_dfr(~data.frame(id = as.integer(.y),
value = .x))
#> id value
#> 1 25 900
#> 2 26 500
或使用CRAN purrr,您可以将名称作为第二个变量传递给map2
:
l %>% map2_df(names(.),
~data.frame(id = as.integer(.y),
value = .x))
#> id value
#> 1 25 900
#> 2 26 500
答案 3 :(得分:0)
使用[start:stop]
包中的melt
函数轻松实现相同目标。
reshape2
输出:
library(reshape2)
l = list('20'=500, '30'=600)
melt(as.data.frame(l, check.names = F))
不使用任何包的替代方法
variable value
1 20 500
2 30 600
输出
ls = list('20' = 500, '30' = 600, '40' = 400)
d = data.frame('id' = row.names(as.array(unlist(ls))), 'value' = unlist(ls),row.names = 1:length(ls))
答案 4 :(得分:0)
使用unlist功能。
L = list(`20`=500,`30`=600)
df = unlist(L)
它返回矢量。如果你想要data.frame:
df = as.data.frame(t(unlist(L)))
输出:
> df
20 30
1 500 600
答案 5 :(得分:0)
以下是org.apache.hadoop.mapreduce.lib.input.FileSplit cannot be cast to org.apache.hadoop.mapred.FileSplit
Map