2017-02-22 70 views
3

数据帧我有一个列表如下:创建列表

yel <- list(c(1,3,5,7,9), 
     c(1,2,6,9), 
     c(2,4,5,6,7,8,9)) 

而且我希望到列表变成像下面的一个数据帧:

1 2 3 
1 1 1 0 
2 0 1 1 
3 1 0 0 
4 0 0 1 
5 1 0 1 
6 0 1 1 
7 1 0 1 
8 0 0 1 
9 1 1 1 

举的想法我是如何到达该列表的:我有一个包含“id”和“text”两列的数据框。 “文本”列是一个字符列表。我在字符列表中找到了独特的单词,并创建了一个数据框“yel”,其中第一个列表表示具有“text1”的“id”,第二个列表表示具有“text2”的“id”等等。 (我的数据集中的“id”例如是)。非常感谢您提前!

回答

4

我们可以用另外mtabulate

library(qdapTools) 
t(mtabulate(yel)) 
# [,1] [,2] [,3] 
#1 1 1 0 
#2 0 1 1 
#3 1 0 0 
#4 0 0 1 
#5 1 0 1 
#6 0 1 1 
#7 1 0 1 
#8 0 0 1 
#9 1 1 1 
+1

非常感谢!这对我的巨大数据集来说就像一个魅力 –

+0

我们可以改变顺序或行吗?就像在这种情况下它的排序,但如果我想要它在一个可以使用mtabulate来做到这一点吗? –

+1

@ManishRanjan是的,你可以将列表元素转换为'factor',并按照你想要的顺序指定'levels',这里我使用'sample'即't(mtabulate(lapply (YE升,因素,水平=样本(1:9))))' – akrun

2

在列表中获取的最大值这是行数。检查列表中的每个阵列是否使用%in%从1到的最大值的所有值都存在于阵列中。这给出了您可以转换为数字的逻辑。

结合了来自@thelatemail

setNames(as.data.frame(lapply(yel, function(x) 
       as.numeric(1:max(unlist(yel)) %in% x))), 1:length(yel)) 
# 1 2 3 
#1 1 1 0 
#2 0 1 1 
#3 1 0 0 
#4 0 0 1 
#5 1 0 1 
#6 0 1 1 
#7 1 0 1 
#8 0 0 1 
#9 1 1 1 
+1

两个小点,我的+1 - ' max_num'可能只是'max(unlist(yel))'和'lapply',第二步可能会使更多的se所以你不会列出 - >矩阵 - >数据帧,而是列表 - >数据帧。 – thelatemail

+0

@ thelatemail,谢谢!我编辑了我的答案,包含您的建议 –

+0

@ d.b非常感谢! –

5

tabulate评论可能会派上用场这里:

setNames(data.frame(lapply(yel, tabulate)), seq_along(yel)) 
# 1 2 3 
#1 1 1 0 
#2 0 1 1 
#3 1 0 0 
#4 0 0 1 
#5 1 0 1 
#6 0 1 1 
#7 1 0 1 
#8 0 0 1 
#9 1 1 1 
+2

来自主人的更多魔力。 –

+0

@thelatemail感谢您的回复。我尝试输入我的数据,并得到以下错误:错误(函数(...,row.names = NULL,check.rows = FALSE,check.names = TRUE,: 参数意味着不同的行数:此外:警告消息: 1:未知列'i' 2:未知列'i' –

+1

类似的替代方法是使用'table'制作一次表格;'table(unlist(yel),rep(1:length (yel),长度(yel)))' –