我一直在寻找等效于使用行索引的行子集,但使用函数子集()。
示例:
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)
答案 0 :(得分:2)
让我们假设您要使用mtcars
从subset
中删除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)