【问题标题】:How to extract elements from list of different vectors and store them in a list如何从不同向量列表中提取元素并将它们存储在列表中
【发布时间】:2018-04-02 08:13:42
【问题描述】:

假设我有两个向量,如下所示:

set.seed(123)
x <- rnorm(10, 0, 1)

y <- rnorm(10, 0, 1)

xy <- list(x,y)

示例(只是为了澄清这是一个示例):我想选择xy 的元素(来自xy)并将它们存储在一个新列表中。

例如,

> xy
[[1]]
 [1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774  1.71506499  0.46091621
 [8] -1.26506123 -0.68685285 -0.44566197

[[2]]
 [1]  1.2240818  0.3598138  0.4007715  0.1106827 -0.5558411  1.7869131  0.4978505 -1.9666172
 [9]  0.7013559 -0.4727914

对于第一个元素,我可以这样做:

list1 <– list(-0.56047565, 1.2240818 ).

但是,如何对所有元素执行此操作?也就是说,如何选择列表的每两个元素并将其存储在新列表中。例如,

list1 <– list(-0.56047565, 1.2240818 ).
list2 <- list(-0.23017749, 0.3598138).
...
...
list10 <– list(-0.44566197, -0.4727914).

有什么帮助吗?

【问题讨论】:

  • @MauritsEvers 非常感谢。我需要对列表的每两个元素执行此操作。
  • @RonakShah 不,这不是重复的。这是不同的。
  • 我解释并编辑了这个问题。
  • @Alice 请查看我更新的解决方案;将所有成对元素存储在 listlists 中更容易。

标签: r


【解决方案1】:

你可以使用lapply:

lapply(xy, function(x) x[1])
#[[1]]
#[1] -0.5604756
#
#[[2]]
#[1] 1.224082

lapply(xy, "[[", 1)

更新

要对你可以做的所有元素执行此操作:

stopifnot(length(xy[[1]]) == length(xy[[2]]))
lst <- lapply(1:length(xy[[1]]), function(i) lapply(xy, "[[", i));
str(lst);
#List of 10
# $ :List of 2
#  ..$ : num -0.56
#  ..$ : num 1.22
# $ :List of 2
#  ..$ : num -0.23
#  ..$ : num 0.36
# $ :List of 2
#  ..$ : num 1.56
#  ..$ : num 0.401
# $ :List of 2
#  ..$ : num 0.0705
#  ..$ : num 0.111
# $ :List of 2
#  ..$ : num 0.129
#  ..$ : num -0.556
# $ :List of 2
#  ..$ : num 1.72
#  ..$ : num 1.79
# $ :List of 2
#  ..$ : num 0.461
#  ..$ : num 0.498
# $ :List of 2
#  ..$ : num -1.27
#  ..$ : num -1.97
# $ :List of 2
#  ..$ : num -0.687
#  ..$ : num 0.701
# $ :List of 2
#  ..$ : num -0.446
#  ..$ : num -0.473

这会将来自xy 的成对元素存储在listlists 中。所以你的list0 将对应于lst[[1]]list1lst[[2]] 等等。

stopifnot(...) 行检查 xy[[1]]xy[[2]] 是否具有相同数量的元素。

【讨论】:

  • 我需要对所有元素都这样做。
  • @Alice 您的问题是“我如何选择第一个元素”。 “所有元素”是什么意思?
  • 感谢您的评论。假设我有两个向量,如下所示: set.seed(123) x
  • 恕我直言。我在问题的最后解释了这一点。
  • @Alice 不,不清楚。请查看我的解决方案。它完全再现了您的预期输出。我将xy 的第一个元素存储在一个新列表中。同样,什么是“所有元素”?你的意思是在独立的lists中存储xy的第二个、第三个等元素吗?还是嵌套的list?一个有代表性的例子的全部意义在于我们期望它是representative。如果不是这种情况,请编辑您的帖子。
【解决方案2】:

data.table 解决这个问题的方法。

不得不说我真的很喜欢 data.table,一个简单的转置就可以解决这个问题。

require(data.table)

head(xy)
[[1]]
 [1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774  1.71506499  0.46091621 -1.26506123 -0.68685285 -0.44566197

[[2]]
 [1]  1.2240818  0.3598138  0.4007715  0.1106827 -0.5558411  1.7869131  0.4978505 -1.9666172  0.7013559 -0.4727914

transpose(xy)
[[1]]
[1] -0.5604756  1.2240818

[[2]]
[1] -0.2301775  0.3598138

[[3]]
[1] 1.5587083 0.4007715

[[4]]
[1] 0.07050839 0.11068272

[[5]]
[1]  0.1292877 -0.5558411

[[6]]
[1] 1.715065 1.786913

[[7]]
[1] 0.4609162 0.4978505

[[8]]
[1] -1.265061 -1.966617

[[9]]
[1] -0.6868529  0.7013559

[[10]]
[1] -0.4456620 -0.4727914

顺便说一句,如果你想创建你想要的列表 1 到 10,你可以编写一个简单的 for 循环:

    for (i in 1:10){
  eval(parse(text=paste0('list.',i,'<-unlist(transpose(xy)[',i,'])')))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多