How to remove rows of a matrix by row name, rather than numerical index?

妖精的绣舞 提交于 2019-11-27 01:15:33

问题


I have matrix 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

Is there a simple way to do what I want to do here (remove the ID's referenced in the vector 'remove' from matrix g?

Note: this is just a model for what I actually want to do, please don't say just do g[-(1:2), ], I need to be able to remove a whole bunch of rows that I have ID-d.


回答1:


When working with indexing, you cannot use "negative" character vectors. You can convert to logical with %in%

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

If you really wanted to use negative-indexing this could be done:

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

... however it has a nasty potential erroneous result that arises when there are not any rownames in the target vector. The result may be no values returned.




回答2:


You cannot negative index a character vector when indexing. Turn your vector remove into a boolean. I've defined a function

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

which can then be used as such: g[rownames(g) %notin% remove ,]




回答3:


I use "setdiff" as follows:

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


来源:https://stackoverflow.com/questions/7576138/how-to-remove-rows-of-a-matrix-by-row-name-rather-than-numerical-index

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!