基于多个列,在df2中没有重复的行净化df1

时间:2017-08-01 13:01:11

标签: r dataframe

我有两个数据框df1df2,每个都有几列。我的目标是修改df1,使其仅包含df2 中基于多列重复的行。不幸的是,我只找到了基于一列或全列的方法。这是一个例子:

df1 <- data.frame(c(seq(1:5)),
                  c(letters[1:5]),
                  c(letters[22:26]))
colnames(df1) <- c("col1", "col2", "col3")

df2 <- data.frame(c(1, 20, 30, 4, 5),
                  c(letters[1:5]),
                  c(letters[15:19]))
colnames(df2) <- c("col1", "col2", "col3")

现在,我想修改df1,使其仅包含df2基于col1col2的重复行。因此,我的目标是获得:

> df3
  col1 col2 col3
1    1    a    v
2    4    d    y
3    5    e    z

4 个答案:

答案 0 :(得分:3)

以下是data.table

的加入选项
library(data.table)
setDT(df1)[df2[1:2], on = .(col1, col2), nomatch = 0]
#   col1 col2 col3
#1:    1    a    v
#2:    4    d    y
#3:    5    e    z

答案 1 :(得分:3)

在基础R中使用merge,您可以执行

merge(df1, df2[, 1:2])
  col1 col2 col3
1    1    a    v
2    4    d    y
3    5    e    z

您必须删除df2的最后一列(或仅保留ID列)。默认情况下,仅保留两个data.frames中匹配的ID。此外,merge会搜索两个data.frames(通过setdiff)匹配的ID的名称,并将它们用于合并操作,这就是我们想要的,所以我们不要#39甚至必须指定&#34; by&#34;或&#34; by.x&#34; /&#34; by.y&#34;参数。

答案 2 :(得分:2)

基础R解决方案可能

df1[with(df1,paste0(col1,"_",col2)) %in% with(df2,paste0(col1,"_",col2)),]

根据@docendo discimus的评论修改

@docendo discimus的替代解决方案:

cols <- c("col1", "col2"); df1[Reduce(&安培; , Map( == , df1[cols], df2[cols])),]

答案 3 :(得分:1)

我们可以使用semi_join中的dplyrdf3是最终输出。

library(dplyr)
df3 <- df1 %>% semi_join(df2, by = c("col1", "col2"))