如果满足 R 中的条件,则执行算术矩阵运算符
Perform arithmetic matrix operators if it meets criteria in R
我有三个矩阵(忽略值,它们只是为了说明)。 a
、b
和c
是相同的变量(他们有相同的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
我们从 b
和 c
中获取行
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.row1
和 d.row2
分别来自 a
、b
和 c
的第 1 行和第 2 行。
我想为 a
、b
和 c
中的每一行创建一个列表。列表中总共有 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
我有三个矩阵(忽略值,它们只是为了说明)。 a
、b
和c
是相同的变量(他们有相同的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
我们从 b
和 c
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.row1
和 d.row2
分别来自 a
、b
和 c
的第 1 行和第 2 行。
我想为 a
、b
和 c
中的每一行创建一个列表。列表中总共有 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