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
)