R语言 将矩阵列表中每个矩阵的第一行除以矩阵列表中每个矩阵的所有行的滞后和

5anewei6  于 2022-12-25  发布在  其他
关注(0)|答案(2)|浏览(182)

我有一个r中的100 - 3 x 51矩阵的列表,并希望将列表中每个矩阵的第一行除以与滞后迭代对应的每个对应矩阵中所有行的滞后(n=2)和。我知道如何在向量列表中的同一行内使用以下代码实现此操作

Example_List2 <- lapply(Example_List1,function(x){x/lag(x,n=2)})

下面是我尝试的3行列表的代码。我最终希望将其作为新数据库的第一行替换,并对具有dif滞后的每一行重复此过程。我尝试的代码是

List2 <- List1
lapply(List2, `[`,1,) <- lapply(List1,function(x){lapply(x, `[`,1,)/lag(colSums(x),n=2)})
lapply(List2, `[`,2,) <- lapply(List1,function(x){lapply(x, `[`,2,)/lag(colSums(x),n=3)})
lapply(List2, `[`,3,) <- lapply(List1,function(x){lapply(x, `[`,3,)/lag(colSums(x),n=4)})
wgx48brx

wgx48brx1#

我们可以使用

library(rbindlist)
List2 <- lapply(List1, \(x) x/do.call(rbind, shift(colSums(x), n = 2:4)))

对于第二种情况

List3 <- lapply(List1, \(x) { 
      n1 <- 2:4
     x1 <- colSums(x)
     x2 <- x
   for(i in seq_along(n1)) {
      x2[i,] <- shift(x[i,], n = n1[i], type = "lead")}
        colSums(x2)/x1
})

数据

set.seed(24)
List1 <- replicate(100, matrix(rnorm(3*51), nrow = 3), simplify = FALSE)
vc9ivgsu

vc9ivgsu2#

试试这个。

lapply(List1, \(x) {
  u <- 1:2
  x[1, -u] <- x[1, -u]/colSums(x[, -u])
  # x[1, u] <- NA_real_  ## uncomment if you want NA for x[1, 1:2]
  x
})
# [[1]]
#      [,1] [,2]      [,3]       [,4]       [,5]
# [1,]    1    4 0.2916667  0.3030303  0.3095238
# [2,]    2    5 8.0000000 11.0000000 14.0000000
# [3,]    3    6 9.0000000 12.0000000 15.0000000
# 
# [[2]]
#       [,1] [,2]      [,3]       [,4]       [,5]
# [1,]    1    4 0.2916667  0.3030303  0.3095238
# [2,]    2    5 8.0000000 11.0000000 14.0000000
# [3,]    3    6 9.0000000 12.0000000 15.0000000
# 
# [[3]]
#       [,1] [,2]      [,3]       [,4]       [,5]
# [1,]    1    4 0.2916667  0.3030303  0.3095238
# [2,]    2    5 8.0000000 11.0000000 14.0000000
# [3,]    3    6 9.0000000 12.0000000 15.0000000
  • 数据:*
List1 <- replicate(3, matrix(1:15, 3, 5), simplify=FALSE)

相关问题