我有两个数据框df1
和df2
,每个都有几列。我的目标是修改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
基于col1
和col2
的重复行。因此,我的目标是获得:
> df3
col1 col2 col3
1 1 a v
2 4 d y
3 5 e z
答案 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
中的dplyr
。 df3
是最终输出。
library(dplyr)
df3 <- df1 %>% semi_join(df2, by = c("col1", "col2"))