按索引对行进行子集化 - 相当于dt [-c(1,2,3),]和子集

时间:2018-02-14 09:32:39

标签: r

我一直在寻找等效于使用行索引的行子集,但使用函数子集()

示例:

vector01 <- c(1, 1, 1, 0, 1)
toremove <- which(vector01 == 0)

dt <- data.frame(Kingdom = c(T,T,T,T,F), Phylum = c(T, T ,F,F,T), Class = c(T, F ,F, F, T),
   row.names=c("GenSpe1", "GenSpe2", "GenSpe3", "GenSpe4", "GenSpe5"), stringsAsFactors = F)

dt <- dt[-toremove, ]

最后我想做这样的事情,只保留与“Phylum”列中的条件匹配的行并删除我之前标记的行:

子集(dt,Phylum == T&amp;!(%,名称(dt)%in%toremove))

我有一个包含物种名称为row.names的数据集。 我提取行的索引以从使用apply函数获得的向量中删除。

通常情况下,我会做一个简单的dt[-rowtoremove, ],但我找不到与subset()相同的内容。 唯一的等价物是根据名称删除行,这在我的情况下是不可能的,如果row.names没有被重置则有风险。 并不是说我不喜欢古老的好方法,但我更喜欢subset()以获得合成语的清晰度,这在合并逻辑表达式时变得更容易阅读。

其他解决方案将用于管道并拆分步骤(logical expression1 & log exp2) -->

dt %<>% dt[-rowstoremove, ] %>% filter with logexpr2

我仍然认为应该存在一种我不知道的子集方式。

提前致谢,

编辑: 我只是试着将我做的子集在子集中放在我的向量上。虽然不是很美观,但似乎有效。

在:

toremove <-- which(vector01[] == 0)
dt <-- dt[-toremove, ]

后:

subset(dt, vector01[] == 0)

2 个答案:

答案 0 :(得分:2)

让我们假设您要使用mtcarssubset中删除1:10行。

 rowsToRemove <- 1:10
 mtcars %>% subset(subset=!(rownames(.) %in% rownames(.)[rowsToRemove]))

答案 1 :(得分:2)

一些简短的方法:

subset(dt,!seq(nrow(dt)) %in% toremove)         # shortest I could think of
subset(dt,!`[<-`(logical(nrow(dt)),toremove,T)) # more efficient

但我只是使用dplyr::slice

library(dplyr)
dt %>% slice(-toremove)