如何提取多个数据帧之间的公共行
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
的方法:
首先,我们连接 df1
和 df2
,只保留它们之间相同的行。这称为内部联接(因此是函数的名称)。默认情况下,所有名称相同的列都被连接起来。因此,df1$V1
连接到 df2$V1
,df1$V2
连接到 df2$V2
。接下来,我们用 df1
和 df2
与 df3
的连接重复相同的过程。
请注意,管道运算符 (%>%
) 将左侧的输出作为第一个参数提供给右侧。
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
我有这样的数据框: 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
的方法:
首先,我们连接 df1
和 df2
,只保留它们之间相同的行。这称为内部联接(因此是函数的名称)。默认情况下,所有名称相同的列都被连接起来。因此,df1$V1
连接到 df2$V1
,df1$V2
连接到 df2$V2
。接下来,我们用 df1
和 df2
与 df3
的连接重复相同的过程。
请注意,管道运算符 (%>%
) 将左侧的输出作为第一个参数提供给右侧。
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