查找2个数据帧中的公共行

时间:2014-02-19 23:51:19

标签: r

我在线搜索了一下,无法找到问题的解决方案。

我有两个数据帧(长度不同):

dataSC_SC_combos

SURVEY_DATE DATA_COLLECTION_SITE
2012-07-01  Site 1
2012-07-01  Site 2
2012-08-10  Site 2
2012-08-10  Site 3
2012-08-11  Site 2
2012-09-20  Site 1

dataSC_FSITE_combos

SURVEY_DATE FISHING_SITE
2012-07-01  Site 1
2012-07-01  Site 3
2012-08-10  Site 2
2012-08-11  Site 1
2012-08-11  Site 1
2012-09-20  Site 1
2012-09-26  Site 1
2012-09-27  Site 1
2012-10-14  Site 1

我想从这些中找到数据和网站的独特组合, 又名。

2012-07-01  Site 1
2012-08-10  Site 2
2012-09-20  Site 1

然后从更大的数据集中为这些独特的组合子集调查SURVEY_DATE& FISHING_SITE或SURVEY_DATE& DATA_COLLECTION_SITE。所以我得到这样的东西:

SURVEY_DATE FISHING_SITE DATA_COLLECTION_SITE
2012-07-01  Site 1       
2012-07-01               Site 1
2012-08-10               Site 2
2012-09-20  Site 1
2012-09-20               Site 1

有没有人知道这样做的好方法? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

可能有更好的解决方案,但您可以这样做:

d1 <- do.call("paste", df1)
d2 <- do.call("paste", df2)
> df1[d1%in%d2, ]
  SURVEY_DATE DATA_COLLECTION_SITE
1  2012-07-01               Site 1
3  2012-08-10               Site 2
6  2012-09-20               Site 1

最终结果:

> df3 <- df1[d1%in%d2, ]
> df4 <- df2[d2%in%d1, ]
> 
> df3$FISHING_SITE <- NA
> df4$DATA_COLLECTION_SITE <- NA
> 
> rbind(df3, df4)
   SURVEY_DATE DATA_COLLECTION_SITE FISHING_SITE
1   2012-07-01               Site 1         <NA>
3   2012-08-10               Site 2         <NA>
6   2012-09-20               Site 1         <NA>
11  2012-07-01                 <NA>       Site 1
31  2012-08-10                 <NA>       Site 2
61  2012-09-20                 <NA>       Site 1

答案 1 :(得分:1)

使用dplyr进行合并,plyr用于排序和绑定行(它们是否相互协调?):

library(dplyr)
library(plyr)
names(dataSC_FSITE_combos) <- names(dataSC_SC_combos) <- c("SURVEY_DATE", "SITE")
ijoin <- inner_join(dataSC_SC_combos, dataSC_FSITE_combos)
#   SURVEY_DATE   SITE
# 1  2012-07-01 Site 1
# 2  2012-08-10 Site 2
# 3  2012-09-20 Site 1

arrange(rbind.fill(
  setNames(
    left_join(ijoin, dataSC_SC_combos), c("SURVEY_DATE","DATA_COLLECTION_SITE")),
  setNames(
    left_join(ijoin, dataSC_FSITE_combos), c("SURVEY_DATE", "FISHING_SITE"))), SURVEY_DATE)
#   SURVEY_DATE DATA_COLLECTION_SITE FISHING_SITE
# 1  2012-07-01               Site 1         <NA>
# 2  2012-07-01                 <NA>       Site 1
# 3  2012-08-10               Site 2         <NA>
# 4  2012-08-10                 <NA>       Site 2
# 5  2012-09-20               Site 1         <NA>
# 6  2012-09-20                 <NA>       Site 1