R - 将列表列表转换为数据帧

时间:2015-03-08 20:37:47

标签: r

我有下一个问题试图将此列表列表转换为数据框,其中列表的唯一元素是它自己的列。

这就是我现在所拥有的:

> head(data$egg_groups)
[[1]]
 name   resource_uri
1   Plant /api/v1/egg/7/
2 Monster /api/v1/egg/1/

[[2]]
 name   resource_uri
1   Plant /api/v1/egg/7/
2 Monster /api/v1/egg/1/

[[3]]
 name   resource_uri
1   Plant /api/v1/egg/7/
2 Monster /api/v1/egg/1/

[[4]]
 name    resource_uri
1  Dragon /api/v1/egg/14/
2 Monster  /api/v1/egg/1/

[[5]]
 name    resource_uri
1  Dragon /api/v1/egg/14/
2 Monster  /api/v1/egg/1/

[[6]]
 name    resource_uri
1  Dragon /api/v1/egg/14/
2 Monster  /api/v1/egg/1/

我想要的是一个数据框,其中一个条目(只是名称)是它自己的一列。

这样的事情:

    Plant Monster Dragon
1     1      1
2     1      1
3     1      1
4            1      1
5            1      1
6            1      1

我已经尝试了库plyr和使用unlist,到目前为止没有任何工作。任何提示将不胜感激。感谢

编辑:这是dput pastebin链接: dput

3 个答案:

答案 0 :(得分:1)

您可以使用rbindlist()中的data.table v1.9.5,如下所示:

(使用@ lukeA'示例)

require(data.table) # 1.9.5+
dt = rbindlist(l, idcol="id")
#    id x y
# 1:  1 a 1
# 2:  1 b 2
# 3:  2 b 2
# 4:  2 c 3

dcast(dt, id ~ x, fun.aggregate = length)
#    id a b c
# 1:  1 1 1 0
# 2:  2 0 1 1

您可以按照here说明进行安装。

答案 1 :(得分:1)

我建议使用“qdapTools”包中的mtabulate。首先,循环遍历列表并将相关列提取为向量,并使用结果列表作为mtabulate的输入,如下所示:

library(qdapTools)
head(mtabulate(lapply(L, `[[`, "name")))
#   Bug Ditto Dragon Fairy Flying Ground Human-like Indeterminate Mineral Monster
# 1   0     0      0     0      0      0          0             0       0       1
# 2   0     0      0     0      0      0          0             0       0       1
# 3   0     0      0     0      0      0          0             0       0       1
# 4   0     0      1     0      0      0          0             0       0       1
# 5   0     0      1     0      0      0          0             0       0       1
# 6   0     0      1     0      0      0          0             0       0       1
#   Plant Undiscovered Water1 Water2 Water3
# 1     1            0      0      0      0
# 2     1            0      0      0      0
# 3     1            0      0      0      0
# 4     0            0      0      0      0
# 5     0            0      0      0      0
# 6     0            0      0      0      0

答案 2 :(得分:0)

这是一种方法:

(l <- list(data.frame(x = letters[1:2], y = 1:2), data.frame(x = letters[2:3], y = 2:3)))
# [[1]]
# x y
# 1 a 1
# 2 b 2
# 
# [[2]]
# x y
# 1 b 2
# 2 c 3
df <- do.call(rbind, lapply(1:length(l), function(x) cbind(l[[x]], id = x) ))
#   x y id
# 1 a 1  1
# 2 b 2  1
# 3 b 2  2
# 4 c 3  2
library(reshape2)
dcast(df, id~x, fun.aggregate = function(x) if (length(x)) "1" else "" )[-1]
#   a b c
# 1 1 1  
# 2   1 1