【问题标题】:how to sort out a nested list in R如何在R中整理嵌套列表
【发布时间】:2016-09-15 07:42:40
【问题描述】:

原始数据是一个像这样命名为“数据”的简单列表

[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&DATE, 我先把它做成矩阵,然后用 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] 分开,并使它们中的每一个成为数据帧。

有什么线索吗?

【问题讨论】:

  • 请包含dput(head(a1))的输出。
  • 看来“b1”只是一个带有length == 3原子元素的“列表”;用as.data.frame 包裹.mapply(c, b1, NULL) 应该可以工作

标签: r list sorting nested


【解决方案1】:

以下内容适用于类似于您的数据的特定类型的嵌套列表。如果没有可重现的例子,我不确定:

# 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')

【讨论】:

  • 考虑:df &lt;- data.frame(do.call(rbind, temp)) ; names(df) &lt;- c('score', 'review', 'ID')
  • 谢谢@Parfait。这样看起来干净了很多。我会添加它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
相关资源
最近更新 更多