我在R中有这样的矩阵:
matrix =
1 2 3 4 5 6 7 8 9 10
X3 TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE
X2 TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE TRUE
X1 FALSE FALSE TRUE FALSE TRUE TRUE FALSE TRUE FALSE TRUE
我需要知道有多少列的3个值为TRUE。我正在寻找的解决方案需要足够通用,以便它可以应用于矩阵的任何可能的维度。我试过了
length(which(apply(matrix, 2, function(x) x[1] & x[2] & x[3])))
虽然有效,但它不是通用的。
你能帮助我吗?
谢谢!
马里亚诺。
答案 0 :(得分:3)
我们可以在逻辑矩阵上使用colSums
并检查它是否为3,即矩阵的行数。获取sum
。
sum(colSums(m1)==nrow(m1))
#[1] 3
由于OP使用apply
,因此也可以使用all
sum(apply(m1, 2, all))
#[1] 3
正如@RHertel在评论中提到的,如果值是数字,并且如果0对应于FALSE而所有其他元素都为TRUE,则将其更改为具有m1!=0
或!!m1
的逻辑矩阵,然后如上所述colSums
以及其余部分。
sum(colSums(!!m1) == nrow(m1))
m1 <- structure(c(TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE,
FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE,
TRUE, TRUE), .Dim = c(3L, 10L), .Dimnames = list(c("X3", "X2",
"X1"), c("X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10")))