根据R中的二进制矩阵获取与每一列关联的行名
Get rownames associated with each column based on binary matrix in R
我有一个矩阵,其中包含表示每个列字段是否与每个行元素相关的二进制数据。我正在寻找创建一个两列数据框来标识与每一行关联的每个字段的名称。我怎样才能在 R 中做到这一点?
这是我开始的例子:
A B C
W 1 1 0
X 0 1 1
Y 1 1 1
Z 0 1 1
我期待这样结束:
Element | Relevant Field
W|A
W|B
X|B
X|C
Y|A
Y|B
Y|C
Z|B
Z|C
有什么提示吗?谢谢!
我们可以使用base R
方法
data.frame(Element = rep(rownames(m1), each = ncol(m1)),
Relevant_Field = rep(colnames(m1), nrow(m1)))[as.vector(t(m1))!=0,]
或 CJ
library(data.table)
CJ(Element = row.names(m1), Relevant_Field = colnames(m1))[as.vector(t(m1)!=0)]
# Element Relevant_Field
#1: W A
#2: W B
#3: X B
#4: X C
#5: Y A
#6: Y B
#7: Y C
#8: Z B
#9: Z C
或者按照@Frank 的建议,我们可以melt
(使用reshape2
)到三列数据集,转换为data.table
并删除0 值
library(reshape2)
setDT(melt(m1))[ value == 1 ][, value := NULL][]
如果你的起始值是这样的矩阵
mm <- matrix(c(1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L),
ncol=3, dimnames = list(c("W", "X", "Y", "Z"), c("A", "B", "C")))
您可以将其视为 table 并相当轻松地展开数据
subset(as.data.frame(as.table(mm)), Freq>0)
# Var1 Var2 Freq
# 1 W A 1
# 3 Y A 1
# 5 W B 1
# 6 X B 1
# 7 Y B 1
# 8 Z B 1
# 10 X C 1
# 11 Y C 1
# 12 Z C 1
这是另一个使用 with
和子集化的基本 R 方法。
# get the positions of 1s in matrix (row / column) output
posMat <- which(mm==1, arr.ind=TRUE)
# build the data.frame
myDf <- data.frame(rowVals=rownames(mm)[posMat[, 1]],
colVals=colnames(mm)[posMat[, 2]])
或其他结构...
# matrix
myMat <- cbind(rowVals=rownames(mm)[posMat[, 1]],
colVals=colnames(mm)[posMat[, 2]])
# vector with pipe separator
myVec <- paste(rownames(mm)[posMat[, 1]], colnames(mm)[posMat[, 2]], sep="|")
我有一个矩阵,其中包含表示每个列字段是否与每个行元素相关的二进制数据。我正在寻找创建一个两列数据框来标识与每一行关联的每个字段的名称。我怎样才能在 R 中做到这一点?
这是我开始的例子:
A B C
W 1 1 0
X 0 1 1
Y 1 1 1
Z 0 1 1
我期待这样结束:
Element | Relevant Field
W|A
W|B
X|B
X|C
Y|A
Y|B
Y|C
Z|B
Z|C
有什么提示吗?谢谢!
我们可以使用base R
方法
data.frame(Element = rep(rownames(m1), each = ncol(m1)),
Relevant_Field = rep(colnames(m1), nrow(m1)))[as.vector(t(m1))!=0,]
或 CJ
library(data.table)
CJ(Element = row.names(m1), Relevant_Field = colnames(m1))[as.vector(t(m1)!=0)]
# Element Relevant_Field
#1: W A
#2: W B
#3: X B
#4: X C
#5: Y A
#6: Y B
#7: Y C
#8: Z B
#9: Z C
或者按照@Frank 的建议,我们可以melt
(使用reshape2
)到三列数据集,转换为data.table
并删除0 值
library(reshape2)
setDT(melt(m1))[ value == 1 ][, value := NULL][]
如果你的起始值是这样的矩阵
mm <- matrix(c(1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L),
ncol=3, dimnames = list(c("W", "X", "Y", "Z"), c("A", "B", "C")))
您可以将其视为 table 并相当轻松地展开数据
subset(as.data.frame(as.table(mm)), Freq>0)
# Var1 Var2 Freq
# 1 W A 1
# 3 Y A 1
# 5 W B 1
# 6 X B 1
# 7 Y B 1
# 8 Z B 1
# 10 X C 1
# 11 Y C 1
# 12 Z C 1
这是另一个使用 with
和子集化的基本 R 方法。
# get the positions of 1s in matrix (row / column) output
posMat <- which(mm==1, arr.ind=TRUE)
# build the data.frame
myDf <- data.frame(rowVals=rownames(mm)[posMat[, 1]],
colVals=colnames(mm)[posMat[, 2]])
或其他结构...
# matrix
myMat <- cbind(rowVals=rownames(mm)[posMat[, 1]],
colVals=colnames(mm)[posMat[, 2]])
# vector with pipe separator
myVec <- paste(rownames(mm)[posMat[, 1]], colnames(mm)[posMat[, 2]], sep="|")