查找条目的总和,其中的条目大于R中的值

时间:2014-08-06 10:16:17

标签: r

我有以下矩阵:

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

还有其他更优雅的方法吗?

1 个答案:

答案 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