【问题标题】:Extract elements from a vector within lists从列表中的向量中提取元素
【发布时间】:2013-07-12 04:56:44
【问题描述】:

我有一个长度为 30000 的列表,每个列表元素包含一个长度为 6 的向量。

示例(长度仅为 2):

trainLists <- list(c(1,2,3,4,5,6),c(7,8,9,10,11,12))

我想将这些列表“展平”成一个数据框并创建 6 个因子(一个对应于列表中向量中的每个元素)。

因此,结果将是:

我可以用一个循环来完成这个,比如

for (i in 1:length(trainLists){
   factor1 [i] <- trainLists[[i]][1]
   factor2 [i] <- trainLists[[i]][2]
   factor3 [i] <- trainLists[[i]][3]
   factor4 [i] <- trainLists[[i]][4]
   factor5 [i] <- trainLists[[i]][5]
   factor6 [i] <- trainLists[[i]][6]
}

但速度非常慢。如何最好地做到这一点?

【问题讨论】:

  • ?rbind?cbind。提示:首先在您的小数据上测试do.call(rbind, trainLists),看看它的作用。
  • 哦,太酷了!谢谢!
  • 要强制转换因子,您可以使用sapply/lapply,但这可能需要再次调用as.data.frame。另一种选择类似于 plyr 包中的colwise(as.factor)(yourData)
  • 同样使用 plyr,您可以尝试ldply(trainLists) 将您的列表转换为数据框。

标签: r list dataframe


【解决方案1】:

正如 cmets 中所述,您想要做的大部分事情都是通过简单的do.call(rbind, ...) 来实现的,如下所示:

> trainLists <- list(c(1,2,3,4,5,6),c(7,8,9,10,11,12))
> trainLists
[[1]]
[1] 1 2 3 4 5 6

[[2]]
[1]  7  8  9 10 11 12

> do.call(rbind, trainLists)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
[2,]    7    8    9   10   11   12

向前迈出几步,你可以这样做:

cbind(example = seq_along(trainLists), 
      setNames(data.frame(do.call(rbind, trainLists)),
               paste0("Factor_", sequence(
                 max(sapply(trainLists, length))))))
#   example Factor_1 Factor_2 Factor_3 Factor_4 Factor_5 Factor_6
# 1       1        1        2        3        4        5        6
# 2       2        7        8        9       10       11       12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2017-02-10
    相关资源
    最近更新 更多