反向 filter/subset 数据帧

Reverse filter/subset dataframe

我的数据类似于:

print(dat)
i1  i2  node_id
 4   4        8
 4   5        8
 3   2        9
 5   1        8

使用 dplyr 的 filtersubset(最好是过滤器)我想反向过滤数据所以我得到这个:

 print(dat)
 i1  i2  node_id
 4   4        8
 4   5        8
 5   1        8

我说反向过滤器是因为它不像过滤或子设置那样:

dat<-filter(dat,node_id==8)
dat<-subset(dat,node_id==8)

我想通过告诉 R 我想保留所有内容来做到这一点,除了 node_id==9 我试过:

dat<-filter(dat,-node_id==9)
dat<-subset(dat,-node_id==9)

但都不起作用。有什么建议么?谢谢。

<, >, <=, >=

的反向过滤

我知道这不是特别要求的,但是如果你想要对 <, >, <=, >= 条件进行反向过滤,如果你想要所有 node_id < 9 以下内容都可以工作

dat <- dat %>% filter(!node_id >= 9)

相同

dat <- dat %>% filter(node_id < 9)

subset() 有多个条件

这与 OP 没有直接关系,但可以在您 subset() 有多个条件的情况下帮助其他人。

假设您有一个数据框 dat 并且您有一个名为 A.dfdat 的子集。你想得到 B.dfdat.

中排除 A.df

One approach是用!反转条件组合:

A.df <- subset(dat, Col1 %in% criteria | Col2 %in% criteria | Col3 %in% criteria)

变成

B.df <- subset(dat, !(Col1 %in% criteria | Col2 %in% criteria | Col3 %in% criteria))

但这可能不适用于嵌套子集(即子集的子集等)。

另一种方法是使用 rownames() 来排除某些行。此方法适用于具有多个条件的子集和嵌套子集。

假设 dat 有 1,2,3,4,5 行,而 A.df 有 3,4 行。因此,我们排除这些行以获得 1,2,5 for B.df.

dat$ID <- rownames(dat)
B.df <- subset(dat, !(ID %in% rownames(A.df)))

第一行是获取 dat 每一行的名称(默认为 1,2,3,...)并将它们附加到新列。