我在R中有一个列表:
List of 4
$ :List of 4
..$ prices : num [1:5] -3.68 -1.5 1.71 1.75 -0.67
..$ lower : num -2.92
..$ midpoint: num 1
..$ upper : num 4.92
$ :List of 4
..$ prices : num [1:5] 0.15395 0.00512 0.02635 0.0388 0.17721
..$ lower : num 0.00422
..$ midpoint: num 0.167
..$ upper : num 0.615
$ :List of 4
..$ prices : num [1:5, 1:3] 0.841 0.514 1.443 1.096 0.913 ...
..$ lower : num [1:3] -0.96 0.04 1.04
..$ midpoint: num [1:3] 1 2 3
..$ upper : num [1:3] 2.96 3.96 4.96
$ :List of 4
..$ prices : num [1:5] 6.78 -0.28 2.565 0.553 14.275
..$ lower : num -4.84
..$ midpoint: num 3
..$ upper : num 10.8
上层列表中的第一项、第二项和第四项是它们应该的,但是第三项应该折叠成三个单独的项。所以最终的结果应该是这样的:
List of 4
$ :List of 4
..$ prices : num [1:5] -3.68 -1.5 1.71 1.75 -0.67
..$ lower : num -2.92
..$ midpoint: num 1
..$ upper : num 4.92
$ :List of 4
..$ prices : num [1:5] 0.15395 0.00512 0.02635 0.0388 0.17721
..$ lower : num 0.00422
..$ midpoint: num 0.167
..$ upper : num 0.615
$ :List of 4
..$ prices : num [1:5] 1 2 3 ... #This should be the FIRST column in the prices matrix of the third item in the original list, 1 2 3 just for the illustration purposes
..$ lower : num -0.96
..$ midpoint: num 1
..$ upper : num 2.96
$ :List of 4
..$ prices : num [1:5] 1 2 3 ... #This should be the SECOND column in the prices matrix of the third item in the original list, 1 2 3 ... just for the illustration purposes
..$ lower : num -0.04
..$ midpoint: num 2
..$ upper : num 3.96
$ :List of 4
..$ prices : num [1:5] 1 2 3 ... #This should be the THIRD column in the prices matrix of the third item in the original list, 1 2 3 ... just for the illustration purposes
..$ lower : num 1.04
..$ midpoint: num 3
..$ upper : num 4.96
$ :List of 4
..$ prices : num [1:5] 6.78 -0.28 2.565 0.553 14.275
..$ lower : num -4.84
..$ midpoint: num 3
..$ upper : num 10.8
有没有比在for循环中填充一个新列表更好的方法,这样:
newlist <- list()
newlist_i <- 1 #This index increases faster than i, whenever we encounter a "compressed" list item.
for(i in 1:length(origlist)) {
if(!is.null(dim(origlist[[i]]$prices)) { #dim(vector) returns NULL
for(j in 1:ncol(prices)) {
newlist[[newlist_i+j-1]]$prices <- origlist[[i]]$prices[,j]
newlist[[newlist_i+j-1]]$lower <- origlist[[i]]$lower[j]
newlist[[newlist_i+j-1]]$midpoint <- origlist[[i]]$midpoint[j]
newlist[[newlist_i+j-1]]$upper <- origlist[[i]]$upper[j]
}
newlist_i = newlist_i + dim(origlist[[i]]$prices) - 1
} else {
newlist[[i]] <- origlist[[i]]
newlist_i = newlist_i + 1
}
}
但是for循环看起来太丑陋和复杂了。有没有更好的方法来做到这一点?
2条答案
按热度按时间cyvaqqii1#
您可以使用
ModifyList
+asplit
+lapply
使用来自@asd-tm
的数据(到期时给予给予学分)uz75evzq2#
我提供了以下基本的R解决方案:
或者如果
prices
的长度未知:两个脚本返回相同的输出:
使用的数据: