我有一个逻辑矩阵x
,带有命名行('a'和'b')和命名列('10','20','30','40')。让我们说,这个:
10 20 30 40
a T F T F
b F T F T
structure(c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE),
.Dim = c(2L, 4L), .Dimnames = list(c("a", "b"), c("10", "20", "30", "40")))
是否有一个简短的方法来获取一个表格,列出我拥有真值的行和列的名称?也就是说,我想得到下表:
a 10, 30
b 20, 40
可以通过生成
的which(x, arr.ind = T)
获得类似的东西
row col
a 1 1
b 2 2
a 1 3
b 2 4
但我真的想得到第一张桌子。
答案 0 :(得分:11)
您可以直接使用apply
。
apply(
x, 1,
function(u) paste( names(which(u)), collapse="," )
)
答案 1 :(得分:2)
你没有指定这个,但是你想要的输出要求我们假设结果实际上是矩形的。也就是说,我们没有获得3个列名称,只有2个列名称用于b。
我认为这应该让你开始,至少:
m <- structure(c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE),
.Dim = c(2L, 4L), .Dimnames = list(c("a", "b"), c("10", "20", "30", "40")))
rr <- rownames(m)[row(m)[which(m)]]
cc <- colnames(m)[col(m)[which(m)]]
dd <- data.frame(rr = rr,cc = cc)
dd
返回您想要的信息,但是采用更安全的“长”格式,不会阻塞非矩形的情况。在那里,你可以像你指定的那样重新组织它:
library(plyr)
ddply(dd,.(rr),function(x){ x$cc })
但坦率地说,最后一点我发现真的很难看,如果等一下,如果有更好的解决方案,我也不会感到惊讶。
答案 2 :(得分:0)
您可以使用table
将对象as.data.frame()
转换为“长”格式数据框的事实:
# Create matrix of interest
mat <- structure(c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), .Dim = c(2L, 4L), .Dimnames = list(c("a", "b"), c("10", "20", "30", "40")))
# Convert to table, then to long data.frame
df <- mat %>% as.table %>% as.data.frame(., stringsAsFactors=FALSE)
结果df
如下:
Var1 Var2 Freq
1 a 10 TRUE
2 b 10 FALSE
3 a 20 FALSE
4 b 20 TRUE
5 a 30 TRUE
6 b 30 FALSE
7 a 40 FALSE
8 b 40 TRUE
然后您可以将其编入索引以仅保留TRUE
行:
df <- df[df$Freq,1:2] %>% sort
df
Var1 Var2
1 a 10
5 a 30
4 b 20
8 b 40
您可以使用dplyr
将其转换为您想要的表格:
library(plyr)
ddply(df, "Var1", function(x) x$Var2)
Var1 V1 V2
1 a 10 30
2 b 20 40