Matrix / Vector上的逻辑运算

时间:2015-09-08 11:43:28

标签: r

我有一个带有逻辑值的二维矩阵(TRUE / FALSE)。

我需要的是一个结果向量,它表示每行的逻辑或元素。

head(m1)
    Z1    Z2    Z3    Z4    Z5    Z6    ZZ
1  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
2 FALSE FALSE FALSE FALSE FALSE FALSE FALSE
3 FALSE FALSE FALSE FALSE FALSE FALSE FALSE
4 FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
5 FALSE FALSE FALSE FALSE FALSE FALSE FALSE
6 FALSE FALSE  TRUE FALSE FALSE FALSE FALSE

得到的矢量(一个暗淡的矩阵)应该看起来像。

    RZ2   
1  TRUE 
2 FALSE 
3 FALSE 
4  TRUE 
5 FALSE 
6  TRUE 

据我所知,一个选项是使用*apply函数。

但在那里使用哪个func-parameter?

2 个答案:

答案 0 :(得分:3)

我们可以在每行中使用rowSumssum TRUE个值。然后,我们加倍否定(!!)以转换回逻辑向量,这样所有不是' 0'将是TRUE和' 0'被强迫FALSE

v1 <- unname(!!rowSums(m1))
v1
#[1]  TRUE FALSE FALSE  TRUE FALSE  TRUE

如果pmaxm1,则其他选项为data.frame。如果每行中有任何TRUE,则TRUE将返回1,仅FALSE值为0。这可以转换回逻辑向量(!=0)。

v1 <- do.call(pmax, as.data.frame(m1))!=0
v1
#[1]  TRUE FALSE FALSE  TRUE FALSE  TRUE

或者我们可以使用apply使用MARGIN=1any作为FUN来遍历行。如果TRUE为TRUE,则返回any,否则为FALSE。

v1 <- unname(apply(m1, 1, any))
v1
#[1]  TRUE FALSE FALSE  TRUE FALSE  TRUE

上述输出vector可以转换为matrix

matrix(v1, ncol=1, dimnames=list(seq_along(v1), 'RZ2'))
#    RZ2
#1  TRUE
#2 FALSE
#3 FALSE
#4  TRUE
#5 FALSE
#6  TRUE

数据

m1 <- structure(c(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), .Dim = 6:7,
.Dimnames = list(
c("1", "2", "3", "4", "5", "6"), c("Z1", "Z2", "Z3", "Z4", 
"Z5", "Z6", "ZZ")))

答案 1 :(得分:1)

也许这样的事情有效:

df = data.frame(c(TRUE,FALSE, FALSE),c(TRUE,FALSE, FALSE),c(TRUE,FALSE, TRUE))
> sumdf = apply(df, MARGIN = 1, FUN = sum)
> sumdf[sumdf > 0] = 1
> sumdf
[1] 1 0 1