Подтвердить что ты не робот

Как удалить строки матрицы по имени строки, а не числовому индексу?

Уверен, что у этого есть простой ответ, не найдя его.

Итак, у меня есть матрица 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,]

Error in -remove : invalid argument to unary operator

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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