此刻我的脑袋静止不动。我想基于较小的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
所需的输出看起来像
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
这感觉应该非常直接。
任何指针都会受到高度赞赏,谢谢!
答案 0 :(得分: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)
答案 1 :(得分: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
答案 2 :(得分:0)
如果在多列上使用 match or %in% ,则可以在多列上使用interaction或paste进行匹配。
df[match(interaction(mdf[c("car_1", "car_2")]), interaction(df[c("car_1", "car_2")])),]
df[match(paste(mdf$car_1, mdf$car_2), paste(df$car_1, df$car_2),),]
df[interaction(df[c("car_1", "car_2")]) %in% interaction(mdf[c("car_1", "car_2")]),]