35

我有矩阵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中删除向量 'remove' 中引用的 ID ?

注意:这只是我真正想做的模型,请不要说 just do g[-(1:2), ],我需要能够删除我拥有 ID-d 的一大堆行。

4

3 回答 3

69

使用索引时,不能使用“负”字符向量。您可以使用 %in% 转换为逻辑

g[!rownames(g) %in% remove, ]  # ! is logical negation

如果您真的想使用负索引,可以这样做:

g[-which(rownames(g) %in% remove), ] #which converts to numeric, so minus sign OK

...但是,当目标向量中没有任何行名时,会出现令人讨厌的潜在错误结果。结果可能没有返回值。

于 2011-09-27T22:11:35.817 回答
7

索引时不能对字符向量进行负索引。把你的向量remove变成一个布尔值。我定义了一个函数

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

然后可以这样使用:g[rownames(g) %notin% remove ,]

于 2011-09-27T22:17:40.120 回答
5

我使用“setdiff”如下:

g[setdiff(rownames(g),remove),]
于 2017-05-29T11:53:43.763 回答