R 如何从不同向量的列表中提取元素并将其存储在列表中
假设我有两个向量,如下所示:R 如何从不同向量的列表中提取元素并将其存储在列表中,r,R,假设我有两个向量,如下所示: set.seed(123) x <- rnorm(10, 0, 1) y <- rnorm(10, 0, 1) xy <- list(x,y) 对于第一个元素,我可以这样做: list1 <– list(-0.56047565, 1.2240818 ). 但是,如何对所有元素执行此操作?也就是说,如何选择列表中的每两个元素并将其存储在新列表中。比如说, > xy [[1]] [1] -0.56047565 -0.2301774
set.seed(123)
x <- rnorm(10, 0, 1)
y <- rnorm(10, 0, 1)
xy <- list(x,y)
对于第一个元素,我可以这样做:
list1 <– list(-0.56047565, 1.2240818 ).
但是,如何对所有元素执行此操作?也就是说,如何选择列表中的每两个元素并将其存储在新列表中。比如说,
> 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 ).
list2 <- list(-0.23017749, 0.3598138).
...
...
list10 <– list(-0.44566197, -0.4727914).
需要帮忙吗 您可以使用Lappy:
或
使现代化
要对所有元素执行此操作,可以执行以下操作:
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
这将在列表列表中存储来自x和y的成对元素。因此,您的列表0将对应于lst[[1]],列表1对应于lst[[2]],依此类推
停止不。。。行检查xy[[1]]和xy[[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,'])')))
}
我需要对所有元素都这样做。@Alice您的问题说明了如何选择第一个元素。你所说的所有元素是什么意思?谢谢你的评论。假设我有两个向量,如下所示:set.seed123 x。我在问题的最后解释一下。@Alice不清楚。请查看我的解决方案。它准确地再现了您的预期输出。我将x和y的第一个元素存储在一个新列表中。再说一遍,所有的元素是什么?您的意思是将x和y的第二、第三等元素存储在独立列表中吗?还是嵌套列表?一个有代表性的例子的全部要点是,我们希望它具有代表性。如果不是这样的话,请编辑你的帖子。@mauritservers非常感谢。我需要对列表中的每两个元素执行此操作。@RonakShah不,这不是重复的。这是不同的。我解释并编辑了这个问题。@Alice请查看我更新的解决方案;将所有成对元素存储在列表中更容易。
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
for (i in 1:10){
eval(parse(text=paste0('list.',i,'<-unlist(transpose(xy)[',i,'])')))
}