2016-05-18 92 views
2

原始数据被命名为“数据”这样如何理清R中嵌套列表

[1] "score: 10/review 1/ID 1 
[2] "score: 9/review 2/ID 2 
[3] "score: 8/review 3/ID 3 
---- 
[30] "score: 7/review 30/ID&DATE: 30 

为了&日期分别挑选出得分的评价和ID的简单罗列, 我第一次做它一个矩阵,然后用“/”使用str_split“stringr”分割它们。

所以整个过程就像这样。

a1 <- readLines("data.txt") 
a2 <- t(a1) # Matrix 
a3 <- t(a2) # reversing rows and columns 
b1 <- str_split(a,"/") 

这里的问题是 B1来如嵌套列表这样。

[[1]] 
[1] "score: 10" 
[2] "review 1" 
[3] "ID 1" 

[[2]] 
[1] "score: 9" 
[2] "review 2" 
[3] "ID 2" 

[[3]] 
[1] "score: 8" 
[2] "review 3" 
[3] "ID 3" 

------ 

[[30]] 
[1] "score: 7" 
[2] "review 30" 
[3] "ID 30" 

我想提取的值[[1]] [1],[2] [1],[[3] [1],... [[30]] [ 1],[[n]] [2]和[[n]] [3],并使它们中的每一个成为数据帧。

任何线索?

+3

请包括'dput(头(A1))'的输出。 –

+0

看来,“b1”只是一个“长度== 3”原子元素的“列表”用'as.data.frame'包装'.mapply(c,b1,NULL)'应该可以工作 –

回答

0

以下内容适用于与您的数据类似的特定类型的嵌套列表。如果没有一个重复的例子,我不知道是肯定的:

# create nested list 
temp <- list(a=c(list("score: 10"), "review 1", "ID 1"), 
     b=c("score: 9", "review 2", "ID 2"), 
     c=c("score: 8", "review 3","ID 3")) 

# create data frame from this list 
df <- data.frame(score=unlist(sapply(temp, function(i) i[1])), 
       review=unlist(sapply(temp, function(i) i[2])), 
       ID=unlist(sapply(temp, function(i) i[3]))) 

我用sapply拔出从各列表项的元素。然后,将unlist应用于输出,以便它变成矢量。所有这些都放在data.frame中。请注意,您可以重新排列输出,以便变量排列不同。

一种更清洁方法,通过@parfait提到的,使用do.callrbind

# construct data.frame, rbinding each list item 
df <- data.frame(do.call(rbind, temp)) 
# add the desired names 
names(df) <- c('score', 'review', 'ID') 
+0

考虑:'df < - data.frame(do.call(rbind,temp)); (df)< - c('score','review','ID')' – Parfait

+0

谢谢@Parfait。这看起来很干净。我会添加它。 – lmo