R:子集列“df A”中的条目到“df B”中的列条目,如果是真匹配则消除

时间:2012-03-10 13:01:04

标签: r match dataframe subset

我是R初学者并且遇到以下非常简单的问题; 我有两个数据框(All_df,Bad_df),并希望生成第三个这样的数据框 All_df - Bad_df = Good_df

> All_df
Row# Originator Recipient  Date          Time
4    1          6          2000-05-16   16:15:00
7    2          7          2000-05-16   16:25:00
22   2          4          2000-07-04   18:05:00
25   2          9          2000-08-07   05:23:00
10   3          2          2000-06-17   18:07:00
13   4          8          2000-06-21   06:49:00 

> Bad_df
Row# Originator    Recipient       Date     Time
4    2             6         2000-05-16 16:15:00
7    2             7         2000-05-16 16:25:00
22   6             4         2000-07-04 18:05:00
25   12            9         2000-08-07 05:23:00
10   30            2         2000-06-17 18:07:00
13   32            8         2000-06-21 06:49:00 



I want to generate Good_df  similar to this:

> Good_df
Row#    Originator Recipient       Date     Time
4        1         6               2000-05-16   16:15:00
10       3         2               2000-06-17   18:07:00
13       4         8               2000-06-21   06:49:00 

基本上我需要一个函数来搜索All_df $ Originator中出现在Bad_df $ Originator中的值,在将剩余值返回给Good_df之前消除任何匹配。

我试过了

Good_df <-subset(All_df, Originator %in% Bad_df$Originator) 

然而每个df的nrows看起来有点偏差!

> nrow(All_df)
[1] 26,032
> nrow(Bad_df)
[1] 1,452
> nrow(Good_df)
[1] 12,395

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

非常直观,

Good_df <-subset(All_df, Originator %in% Bad_df$Originator)

为您提供不良发起人的All_df子集。你想要的是使用!运算符否定你的过滤器以获得好的(或非坏的)发起者的子集:

Good_df <-subset(All_df, ! Originator %in% Bad_df$Originator)

如果您对先行规则不满意,可以添加一组括号:

Good_df <-subset(All_df, !(Originator %in% Bad_df$Originator))