如果满足 R 中的条件,则执行算术矩阵运算符

Perform arithmetic matrix operators if it meets criteria in R

我有三个矩阵(忽略值,它们只是为了说明)。 abc是相同的变量(他们有相同的columns/variables和"positioning",但测量的东西不同)

# my actual mat is 120x80
a = rbind(c(1,1,2,3,1), c(2,2,3,1,2), c(3,3,1,2,1)) 
a
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    2    3    1
[2,]    2    2    3    1    2
[3,]    3    3    1    2    1

# my actual mat is 120x80    
b = rbind(c(0.8,0.6,0.7,0.8,0.9), c(0.6,0.7,0.8,0.7,0.6), c(0.8,0.9,0.7,0.6,0.9))
b
     [,1] [,2] [,3] [,4] [,5]
[1,]  0.8  0.6  0.7  0.8  0.9
[2,]  0.6  0.7  0.8  0.7  0.6
[3,]  0.8  0.9  0.7  0.6  0.9

# my actual mat 120x80
c = rbind(c(0.1,0.1,0.3,0.2,0.1), c(0.3,0.2,0.1,0.2,0.1), c(0.2,0.3,0.1,0.2,0.3))
c
     [,1] [,2] [,3] [,4] [,5]
[1,]  0.1  0.1  0.3  0.2  0.1
[2,]  0.3  0.2  0.1  0.2  0.1
[3,]  0.2  0.3  0.1  0.2  0.3

我们从 bc

中获取行
If 1 in a[1,] then b[1,]-c[1,], else -c[1,]
If 2 in a[1,] then b[1,]-c[1,], else -c[1,]    or simply 0-c[1,]
If 3 in a[1,] then b[1,]-c[1,], else -c[1,]

d.row1 (a 3x80 matrix)
rownames(drow1)<-c("1","2","3")
  [,1] [,2] [,3] [,4] [,5]
1  0.7  0.5 -0.3 -0.2  0.8
2 -0.1 -0.1  0.4 -0.2 -0.1
3 -0.1 -0.1 -0.3  0.6 -0.1

请注意,d.row1[1,1]d.row1[1,2]d.row1[1,5]a[1,] 中的分类为 1,而第 1 行中的其他值的值为 2 或 3。因此, 我们执行了操作 b[1,]-c[1,] 而不是 -c[1,].

看起来像这样:

同样,对于行 a[2,]

If 1 in a[2,] then b[2,]-c[2,], else -c[2,]
If 2 in a[2,] then b[2,]-c[2,], else -c[2,]    or simply 0-c[2,]
If 3 in a[2,] then b[2,]-c[2,], else -c[2,]

d.row2 (a 3x80 matrix)
  [,1] [,2] [,3] [,4] [,5]
1 -0.3 -0.2 -0.1  0.5 -0.1
2  0.3  0.5 -0.1 -0.2  0.5
3 -0.3 -0.2  0.7 -0.2 -0.1

请注意,d.row1d.row2 分别来自 abc 的第 1 行和第 2 行。

我想为 abc 中的每一行创建一个列表。列表中总共有 120 个数据帧(因为我在其他矩阵中有 120 行)。

我认为 for 循环或类似方法可能对我的问题有用。

提前致谢!

您的基本操作可以使用(a 的第 1 行)

计算
d.row1 <-  b[rep(1, 3), ] * outer(1:3, a[1,], "==") - c[rep(1, 3), ]

列表可以使用 lapply 完成 - 其他选项不提供右侧 input/output 的选项(tapply 需要矢量输入,仅 apply允许矩阵输出)。

这是最终结果:

d <- lapply(1:nrow(a), function(i) {
  c[rep(i,3),]* outer(1:3, a[i,], "==") - c[rep(i,3),]
})

> d
[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]  0.7  0.5 -0.3 -0.2  0.8
[2,] -0.1 -0.1  0.4 -0.2 -0.1
[3,] -0.1 -0.1 -0.3  0.6 -0.1

[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,] -0.3 -0.2 -0.1  0.5 -0.1
[2,]  0.3  0.5 -0.1 -0.2  0.5
[3,] -0.3 -0.2  0.7 -0.2 -0.1

[[3]]
     [,1] [,2] [,3] [,4] [,5]
[1,] -0.2 -0.3  0.6 -0.2  0.6
[2,] -0.2 -0.3 -0.1  0.4 -0.3
[3,]  0.6  0.6 -0.1 -0.2 -0.3