【问题标题】:Combining elements of a list into a single element [duplicate]将列表的元素组合成一个元素[重复]
【发布时间】:2018-01-15 19:40:38
【问题描述】:

我在 R 中有一个类似这样的列表。

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

[[2]]
[1] 4 5

[[3]]
[1]  6  7  8  9 10

(实际列表要长得多,有接近 1000 个元素,每个元素的长度不同)

我想将上面列表的元素组合成一个数据框,这样输出看起来像这样。 ID 表示从中派生出相应值的列表元素

基本上它应该看起来像以下使用 R 代码直接创建的数据框。

> list.data.final <- data.frame("ID"=numeric(10), "value"=numeric(10))
> list.data.final$ID <- c(1,1,1,2,2,3,3,3,3,3)
> list.data.final$value <- 1:10
> list.data.final
   ID value
1   1     1
2   1     2
3   1     3
4   2     4
5   2     5
6   3     6
7   3     7
8   3     8
9   3     9
10  3    10

ID 是从中派生值的列表元素。值列包含列表中的所有值。

有没有办法做到这一点?

【问题讨论】:

  • 我意识到问题中的输出数据框显示不正确。本质上它应该看起来像下面使用 R 代码直接创建的数据框。

标签: r list


【解决方案1】:

试试这个:

list.data <- list(c(1,2,3), c(4,5), c(6,7,8,9,10))
data.frame(
  id=rep(seq_along(list.data), lengths(list.data)),
  value=unlist(list.data)
)
#    id value
# 1   1     1
# 2   1     2
# 3   1     3
# 4   2     4
# 5   2     5
# 6   3     6
# 7   3     7
# 8   3     8
# 9   3     9
# 10  3    10

事后看来,这个问题与From list to data frame (again...) keeping element names as row names 重复......我很高兴看到我想出了一个类似的答案!唯一的区别是 q/a 依赖于 named-list,这个没有名字;它使用了sapply(..., length),其中lengths(R-3.2 左右发布)可能更高效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2018-11-03
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多