2017-01-11 4 views
0

Кажется, что этого вопроса следовало задавать несколько раз, но я безуспешно ищу Questions that may already have your answer.Подмножество столбцов матрицы матрицы R на конкретную запись

Как вы подмножите с булевыми операторами (без использования subset()) столбцов матрицы?

> m = matrix(c("A", "B", "B", "B", "C", "A", "C", "C", "D"), nrow = 3) 
> m 
    [,1] [,2] [,3] 
[1,] "A" "B" "C" 
[2,] "B" "C" "C" 
[3,] "B" "A" "D" 

Обратите внимание, что столбцы не имеют имен, и я хочу любых столбцов, содержащих в некоторой записи значения «D».

Например, в this post, звонок grades[grades[,"pass"] == 2,]. Помимо того факта, что вызов заключается в извлечении строк, а тот факт, что pass относится к одному столбцу, имена столбцов отсутствуют.

Я попытался:

> m[m == "D", ] 
Error in m[m == "D", ] : (subscript) logical subscript too long 

> m[which(m=="D"), ] 
Error in m[which(m == "D"), ] : subscript out of bounds 

> m = as.data.frame(m) # Turning the matrix into a df 
> m[m == "D", ] 
    V1 V2 V3 
NA <NA> <NA> <NA> 

ответ

1

Вот альтернатива.

m[, colSums(m == "D") > 0, drop=FALSE] 
    [,1] 
[1,] "C" 
[2,] "C" 
[3,] "D" 

m==D строит логическую матрицу, то colSums подсчитывает количество трас. Затем проверяются, будут ли они больше 0. Результат этой проверки используется для подмножества матрицы. После ответа @ cdeterman я добавил drop = FALSE, чтобы сохранить структуру матрицы.

+0

Действительно элегантный! Спасибо! – Toni

2

Вы можете использовать apply вызов для поиска элементов столбцов и индекс на них.

m[,apply(m, MARGIN = 2, function(x) any(x == "D")), drop = FALSE] 

    [,1] 
[1,] "C" 
[2,] "C" 
[3,] "D" 

Примечание - вы заметите drop = FALSE аргумент присутствует. Это делается для того, чтобы выход был еще матрицей, если есть только 1 столбец.

+0

спасибо. Это один болезненный способ подмножества. Пожалуйста, не ошибитесь в этом как о критике, потому что вы вполне можете быть верным - R не особенно легким ... «MARGIN = 2» вводит концепцию, которую нам нужны столбцы? – Toni

+0

Правильно, 'MARGIN' указывает, если над строками или столбцами. Это можно увидеть в документации. – cdeterman

+0

@Toni, также если это удовлетворит ваш вопрос, пожалуйста, не забудьте принять этот ответ. – cdeterman

Смежные вопросы