匹配基于多列的两个data.frames

jO.*_*jO. 8 r match dataframe

我的脑袋暂时停滞不前.我想基于较小的data.frame(mdf)中的列来匹配/提取来自更大的data.frame(df)的数据.我要坚持的是我想要匹配多个列(在这种情况下为两个).我一直在使用例如尝试不同的方法merge,which,match %in%但不就成功了.

# Dummy example

# Large df
df <- mtcars[1:6,1:3]
df$car_1 <- rownames(df)
df$car_2 <- rownames(tail(mtcars))

# df to match
mdf <- df[c("car_1","car_2")][3:6,]

rownames(df) <- NULL
rownames(mdf) <- NULL
Run Code Online (Sandbox Code Playgroud)

期望的输出看起来像

 mpg cyl disp             car_1          car_2
22.8   4  108        Datsun 710 Ford Pantera L
21.4   6  258    Hornet 4 Drive   Ferrari Dino  
18.7   8  360 Hornet Sportabout  Maserati Bora
18.1   6  225           Valiant     Volvo 142E
Run Code Online (Sandbox Code Playgroud)

这感觉应该是非常直接的.

任何指针都将受到高度赞赏,谢谢!

Kar*_*Woo 8

怎么样merge(df, mdf, all.x = FALSE, all.y = TRUE)

编辑:如果您有不同的列名,您可以指定要合并的列,例如:

names(mdf) <- c("car_3", "car_4")
merge(df, mdf, by.x = c("car_1", "car_2"), by.y = c("car_3", "car_4"), 
      all.x = FALSE, all.y = TRUE)
Run Code Online (Sandbox Code Playgroud)


jaz*_*rro 6

另一种方式是:

library(dplyr)
inner_join(df, mdf)

#Joining by: c("car_1", "car_2")
#              car_1          car_2  mpg cyl disp
#1        Datsun 710 Ford Pantera L 22.8   4  108
#2    Hornet 4 Drive   Ferrari Dino 21.4   6  258
#3 Hornet Sportabout  Maserati Bora 18.7   8  360
#4           Valiant     Volvo 142E 18.1   6  225
Run Code Online (Sandbox Code Playgroud)


GKi*_*GKi 5

如果您要在多个列上使用match 或 %in%您可以使用交互粘贴或使用列表来匹配多个列。

df[match(interaction(mdf), interaction(df[c("car_1", "car_2")])),]

df[match(paste(mdf$car_1, mdf$car_2), paste(df$car_1, df$car_2),),]

df[match(asplit(mdf, 1), asplit(df[c("car_1", "car_2")], 1)),]

df[interaction(df[c("car_1", "car_2")]) %in% interaction(mdf),]
Run Code Online (Sandbox Code Playgroud)