R:如何获取矩阵的真实元素的行名和列名?

时间:2012-02-29 20:08:49

标签: r

我有一个逻辑矩阵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

但我真的想得到第一张桌子。

3 个答案:

答案 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