将列表转换为具有特定标题的数据框

时间:2017-04-19 17:30:48

标签: r list dataframe

我有一个这样的清单:

$20
[1] 500

$30
[2] 600

我想将其转换为像这样的数据框

id    values
20     500
30     600  

6 个答案:

答案 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