R: как получить имена строк и столбцов истинных элементов матрицы? - PullRequest
9 голосов
/ 01 марта 2012

У меня есть логическая матрица 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 ]

11 голосов
/ 01 марта 2012

Вы можете напрямую использовать apply.

apply(
  x, 1, 
  function(u) paste( names(which(u)), collapse="," ) 
)
2 голосов
/ 01 марта 2012

Вы не указали это, но желаемый результат потребует, чтобы мы предположили, что результат на самом деле является прямоугольным.А именно, мы не получаем 3 имен столбцов для a и только 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 })

, но, честно говоря, этот последний бит мне кажется действительно уродливым, и я не удивлюсь, если появится лучшее решение, если вы будете ждатьнемного.

0 голосов
/ 20 марта 2017

Вы можете использовать тот факт, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...