R 将逻辑矩阵转换为长格式

R 将逻辑矩阵转换为长格式,r,R,我希望将行和列名匹配的逻辑矩阵分解为长格式 #Toy input matrix(c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE), nrow=2, dimnames=list(c("a","b"), c("x","y","z"))) x y z a TRUE FALSE FALSE b TRUE TRUE FALSE #Desired

我希望将行和列名匹配的逻辑矩阵分解为长格式

#Toy input
matrix(c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE), nrow=2, dimnames=list(c("a","b"), c("x","y","z")))
     x     y     z
a TRUE FALSE FALSE
b TRUE  TRUE FALSE

#Desired output
  R C
1 a x
2 b x
3 b y

如果该矩阵被称为
mat
,则可以使用
which
arr.ind=TRUE
来获取
TRUE
值的行数和列数。使用它来索引
行名
列名

mat1 <- which(mat, arr.ind = TRUE)
data.frame(R = rownames(mat)[mat1[, 1]], C = colnames(mat)[mat1[, 2]])

#  R C
#1 a x
#2 b x
#3 b y

mat1如果该矩阵被称为
mat
,您可以使用
which
arr.ind=TRUE
来获取
TRUE
值的行数和列数。使用它来索引
行名
列名

mat1 <- which(mat, arr.ind = TRUE)
data.frame(R = rownames(mat)[mat1[, 1]], C = colnames(mat)[mat1[, 2]])

#  R C
#1 a x
#2 b x
#3 b y

mat1如果矩阵是
x
,那么您可以使用两个
dplyr
函数来实现这一点

library(reshape2)
library(dplyr)    
x %>% melt() %>% filter(value) %>% select(Var1, Var2)

如果矩阵是
x
,那么您可以使用两个
dplyr
函数来获得该矩阵

library(reshape2)
library(dplyr)    
x %>% melt() %>% filter(value) %>% select(Var1, Var2)

比上面更模糊,但在单个表达式中:

# Split-Apply-Combine:
do.call(rbind, lapply(seq_len(ncol(mat)), function(i){
  transform(data.frame(R = row.names(mat)[mat[,i, drop = TRUE]]),
             C = rep(dimnames(mat)[[2]][i], length(R)))
    }
  )
)

# OR Reshape (base):
subset(
  reshape(
    transform(mat, R = row.names(mat)),
    varying = colnames(mat),
    idvar = "R",
    v.names = "keep",
    timevar = "C",
    times = colnames(mat),
    direction = "long",
    new.row.names = seq_len(ncol(mat) * nrow(mat))
  ),
  keep,
  select = -keep
)

比上面更模糊,但在单个表达式中:

# Split-Apply-Combine:
do.call(rbind, lapply(seq_len(ncol(mat)), function(i){
  transform(data.frame(R = row.names(mat)[mat[,i, drop = TRUE]]),
             C = rep(dimnames(mat)[[2]][i], length(R)))
    }
  )
)

# OR Reshape (base):
subset(
  reshape(
    transform(mat, R = row.names(mat)),
    varying = colnames(mat),
    idvar = "R",
    v.names = "keep",
    timevar = "C",
    times = colnames(mat),
    direction = "long",
    new.row.names = seq_len(ncol(mat) * nrow(mat))
  ),
  keep,
  select = -keep
)