web-dev-qa-db-ja.com

数値インデックスではなく行名でマトリックスの行を削除する方法は?

私は行列を持っています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のエラー:単項演算子への引数が無効です

私がここでやりたいことを行う簡単な方法はありますか?ベクトルで参照されているIDを行列から削除しますg

注:これは、私が実際にやりたいことの単なるモデルです。ただg[-(1:2), ]とは言わないでください。 ID-dがあります。

33
JoshDG

インデックス付けを使用する場合、「負の」文字ベクトルを使用できません。 %in%で論理に変換できます

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

本当に負のインデックスを使用したい場合、これを行うことができます:

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

...ただし、ターゲットベクトルに行名がない場合に発生する厄介な誤った結果があります。結果は値が返されない場合があります。

60
42-

インデックス付け時に文字ベクトルに負のインデックスを付けることはできません。ベクトルremoveをブール値に変換します。関数を定義しました

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

その後、次のように使用できます:g[rownames(g) %notin% remove ,]

7
Chase

次のように「setdiff」を使用します。

g[setdiff(rownames(g),remove),]
4
Ofri Mann