在R中提取唯一记录?

时间:2017-04-13 17:15:04

标签: r data-extraction

我试过"独特"和"重复"但是不能让R做我想做的事情,这基本上是比较两组数据并找出第一组数据不在第二组数据上。 data1包含客户ID,姓名和人们购买X的年份.data2包含客户ID和年份(2017年),表明他们今年购买了X.我想要做的是从今年没有购买X的data1中提取人员列表...所以我可以联系他们并告诉他们再次购买X.

> data1 
ID  NAME YEAR 
8   Ann 2016 
10  Bill 2014
11  Doug 2016
12  Emma 2015
5   Fred 2014
9   Julie 2014
13  Karl 2016
15  Matt 2014
14  Rhett 2014
7   Sara 2015
4   Tom 2014

> data2
ID YEAR
29 2017
32 2017
10 2017
21 2017
11 2017
5  2017
28 2017
33 2017
24 2017
22 2017
31 2017
15 2017
25 2017
30 2017
26 2017
7  2017
23 2017
27 2017

按ID合并data1和data2(合并(data1,dat2," ID"))给了我:

> merged_d1d2
  ID NAME YEAR.x YEAR.y
1  5 Fred   2014   2017
2  7 Sara   2015   2017
3 10 Bill   2014   2017
4 11 Doug   2016   2017
5 15 Matt   2014   2017

...但我希望除了这些人之外的所有人!我还将名称添加到data2中,然后使用rbind组合data1和data2,这给了我一个带有重复项的数据集(例如2 Fred,2 Sara,2 Bill等)然后我尝试使用" unique"和"重复"但是这些总是在新数据中留下其中一个重复(1个Fred,1个Sara)。除了那些人,我希望所有人都来自data1。我觉得这是一个简单的过程,但任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:2)

简单地:

data1[!data1$ID%in%data2$ID,]

   ID  NAME YEAR
1   8   Ann 2016
4  12  Emma 2015
6   9 Julie 2014
7  13  Karl 2016
9  14 Rhett 2014
11  4   Tom 2014

或者您可以通过anti_join中的ID尝试dplyr

data1 <- read.table(text="ID  NAME YEAR
8   Ann 2016
10  Bill 2014
11  Doug 2016
12  Emma 2015
5   Fred 2014
9   Julie 2014
13  Karl 2016
15  Matt 2014
14  Rhett 2014
7   Sara 2015
4   Tom 2014",header=TRUE, stringsAsFactors=FALSE)

data2 <- read.table(text="ID YEAR
29 2017
32 2017
10 2017
21 2017
11 2017
5  2017
28 2017
33 2017
24 2017
22 2017
31 2017
15 2017
25 2017
30 2017
26 2017
7  2017
23 2017
27 2017",header=TRUE, stringsAsFactors=FALSE)

library(dplyr)
anti_join(data1,data2,by="ID")

  ID  NAME YEAR
1  4   Tom 2014
2  8   Ann 2016
3  9 Julie 2014
4 12  Emma 2015
5 13  Karl 2016
6 14 Rhett 2014