如何提取多个数据帧之间的公共行

How to extract common rows between multiple dataframes

我有这样的数据框: df1:

 V1 V2
1 a  b
2 c  d
3 a  e

df2:

 V1 V2
1 a  b
2 c  e
3 a  f

df3:

 V1 V2
1 a  b
2 c  f
3 a  m

每个数据框都没有重复的行。我希望提取这些数据帧中的公共行: df:

 V1 V2 
1 a  b

怎么做?

这是 inner_join 来自 dplyr 的方法:

首先,我们连接 df1df2,只保留它们之间相同的行。这称为内部联接(因此是函数的名称)。默认情况下,所有名称相同的列都被连接起来。因此,df1$V1 连接到 df2$V1df1$V2 连接到 df2$V2。接下来,我们用 df1df2df3 的连接重复相同的过程。

请注意,管道运算符 (%>%) 将左侧的输出作为第一个参数提供给右侧。

library(dplyr)
inner_join(df1,df2) %>%
  inner_join(df3)
#  V1 V2
#1  a  b

另请注意,如果列在 data.frame 中的名称不同,您可以明确定义关系:

inner_join(df1,df2, by = c("V1" = "V1", "V2" = "V2"))

使用 {purrr:reduce} 可以实现一种灵活的方式(无论您正在查看多少数据帧)。只需将您的数据框放入列表中并应用 inner_join.

减少它们
library(tibble)
library(dplyr)
library(purrr)

df1 <- tribble(
    ~V1, ~V2,
    "a", "b",
    "c", "d",
    "a", "e"
)

df2 <- tribble(
    ~V1, ~V2,
    "a", "b",
    "c", "e",
    "a", "f"
)

df3 <- tribble(
    ~V1, ~V2,
    "a", "b",
    "c", "f",
    "a", "m"
)

# Put all data frames in a list
df_list <- list(df1, df2, df3)

reduce(df_list, inner_join)
#> Joining, by = c("V1", "V2")
#> Joining, by = c("V1", "V2")

#> # A tibble: 1 x 2
#>   V1    V2   
#>   <chr> <chr>
#> 1 a     b

reprex package (v0.3.0)

于 2020-06-08 创建

每个数据框没有重复的行时,您可以使用merge提取多个数据框之间的公共行:

merge(merge(df1, df2), df3)
#  V1 V2
#1  a  b

#Reduce(merge, list(df1, df2, df3)) #Alternative in case there are more than 3 tables