我有以下矩阵:
m = structure(1:20, .Dim = 4:5)
m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
>
我希望在每行中找到条目总数超过5的条目。
我只能在转换为data.frame并使用2'for'循环后才能这样做。
ddf = data.frame(m)
ddf
X1 X2 X3 X4 X5
1 1 5 9 13 17
2 2 6 10 14 18
3 3 7 11 15 19
4 4 8 12 16 20
for(i in 1:nrow(ddf)){
dsum=0
for(j in 1:ncol(ddf)){
if(ddf[i,j] > 5) dsum = dsum+ddf[i,j]
}
print(dsum)
}
[1] 39
[1] 48
[1] 52
[1] 56
还有其他更优雅的方法吗?
答案 0 :(得分:5)
您可以使用rowSums()
使用某些子集或使用矩阵乘法
第一个解决方案:使用rowSums()
:
rowSums(m*(m>5))
[1] 39 48 52 56
这是因为:
m>5
[,1] [,2] [,3] [,4] [,5]
[1,] FALSE FALSE TRUE TRUE TRUE
[2,] FALSE TRUE TRUE TRUE TRUE
[3,] FALSE TRUE TRUE TRUE TRUE
[4,] FALSE TRUE TRUE TRUE TRUE
m*(m>5)
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 9 13 17
[2,] 0 6 10 14 18
[3,] 0 7 11 15 19
[4,] 0 8 12 16 20
第二种解决方案,使用矩阵数学:
diag(m %*% t(m>5))
[1] 39 48 52 56
如果所有其他方法都失败了,请按apply
方式执行:
apply(m, 1, function(x)sum(x[x>5]))
[1] 39 48 52 56