Как убрать строки матрицы по имени строки, а не по числовому индексу? - PullRequest
33 голосов
/ 28 сентября 2011

У меня есть матрица g :

> g[1:5,1:5]
        rs7510853 rs10154488 rs12159982 rs2844887 rs2844888
NA06985 "CC"      "CC"       "CC"       "CC"      "CC"     
NA06991 "CC"      "CC"       "CC"       "CC"      "CC"     
NA06993 "CC"      "CC"       "CC"       "CC"      "CC"     
NA06994 "CC"      "CC"       "CC"       "CC"      "CC"     
NA07000 "CC"      "CC"       "CC"       "CC"      "CC"     
> rownames(g)[1:2]->remove
> remove
[1] "NA06985" "NA06991"
> g[-remove,]

Ошибка в -remove: неверный аргумент для унарного оператора

Есть ли простой способчтобы сделать то, что я хочу сделать здесь (удалить идентификатор, указанный в векторе «удалить» из матрицы g ?

Примечание: это просто модель для того, чтоЯ на самом деле хочу сделать, пожалуйста, не говорите просто сделать g[-(1:2), ], мне нужно иметь возможность удалить целую кучу строк, которые у меня есть ID-d.

Ответы [ 3 ]

59 голосов
/ 28 сентября 2011

При работе с индексированием нельзя использовать «отрицательные» символьные векторы.Вы можете преобразовать в логическое значение с% в%

g[!rownames(g) %in% remove, ]

Если вы действительно хотите использовать отрицательную индексацию, это можно сделать:

g[-which(rownames(g) %in% remove), ]

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

7 голосов
/ 28 сентября 2011

Вы не можете отрицательно индексировать символьный вектор при индексации. Преврати свой вектор remove в логическое значение. Я определил функцию

`%notin%` <- function(x,y) !(x %in% y) 

, который затем можно использовать как таковой: g[rownames(g) %notin% remove ,]

4 голосов
/ 29 мая 2017

Я использую «setdiff» следующим образом:

g[setdiff(rownames(g),remove),]
...