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

r matrix subset rowname

46411 просмотра

3 ответа

У меня матрица г :

> 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.

Автор: JoshDG Источник Размещён: 12.11.2019 09:08

Ответы (3)


61 плюса

Решение

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

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

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

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

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

Автор: 42- Размещён: 27.09.2011 10:11

7 плюса

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

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

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

Автор: Chase Размещён: 27.09.2011 10:17

4 плюса

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

g[setdiff(rownames(g),remove),]
Автор: Ofri Mann Размещён: 29.05.2017 11:53
Вопросы из категории :
32x32