gpt4 book ai didi

r - 在 dplyr 中,如何通过可能存在或可能不存在的列连接数据帧?

转载 作者:行者123 更新时间:2023-12-03 18:54:14 24 4
gpt4 key购买 nike

我有两个想要加入的数据帧。虽然我总是有一个主要的相互列要加入,但有时除了主要的列之外,我还可能希望在数据中加入另一列。
如何指定要加入的可能列?
例子
我用源自 mtcars 的两个数据集来演示我的问题.两者都有一个我将始终加入的“主”列( cars ),有时在一个或两个数据集中可能还有另一个相互列( some_letters )。

library(tidyverse)

create_df <- function(columns_to_include) {

mtcars %>%
rownames_to_column("cars") %>%
select(cars, {{ columns_to_include }}) %>%
slice_sample(n = 15) %>%
{if (sample(c(TRUE, FALSE), size = 1)) add_column(., some_letters = letters[1:15]) else .}
}

# both dataframes have "some_letters"
set.seed(123)
df_a1 <- create_df(carb)
df_a2 <- create_df(gear)
scenario_a <- inner_join(df_a1, df_a2, by = c("cars", "some_letters"))
scenario_a
#> cars carb some_letters gear
#> 1 Ford Pantera L 4 l 5

# neither dataframe has "some_letters"
set.seed(111)
df_b1 <- create_df(carb)
df_b2 <- create_df(gear)
scenario_b <- inner_join(df_b1, df_b2, by = c("cars", "some_letters"))
#> Error: Join columns must be present in data.
#> x Problem with `some_letters`.

# one dataframe has "some_letters" but the other doesn't
set.seed(737)
df_c1 <- create_df(carb)
df_c2 <- create_df(gear)
scenario_c <- inner_join(df_c1, df_c2, by = c("cars", "some_letters"))
#> Error: Join columns must be present in data.
#> x Problem with `some_letters`.
创建于 2021-02-20 由 reprex package (v0.3.0)
我们可以在 scenario_a 中看到连接有效,因为 df_a1df_a2包括 some_letters .然而,在 scenario_b我们看到连接失败是因为 some_letters不存在(在任一数据中)。同样, scenario_c显示的情况是 some_letters出现在一个数据集中但不在另一个数据集中,因此连接失败。
加入数据时,可以指定 some_letters吗?是可能的,但不能保证出现,这样当它出现在两个数据中时,它将成为一个额外的 join-by 列,否则它将被 by 忽略。争论?
期望输出
inner_join(df_b1, df_b2, by = c("cars", "some_letters"))

# as if we joined by `cars` only:

## cars carb gear
## 1 Porsche 914-2 2 5
## 2 Cadillac Fleetwood 4 3
## 3 Pontiac Firebird 2 3
## 4 Datsun 710 1 4
## 5 Merc 240D 2 4
## 6 Chrysler Imperial 4 3
## 7 Hornet 4 Drive 1 3
## 8 Camaro Z28 4 3

最佳答案

创建 intersect 的向量名字

library(dplyr)
library(purrr)
nm1 <- reduce(list(names(df_b1), names(df_b2),
c("cars", "some_letters")), intersect)
然后加入
inner_join(df_b1, df_b2, by =  nm1)
-输出
#                cars carb gear
#1 Porsche 914-2 2 5
#2 Cadillac Fleetwood 4 3
#3 Pontiac Firebird 2 3
#4 Datsun 710 1 4
#5 Merc 240D 2 4
#6 Chrysler Imperial 4 3
#7 Hornet 4 Drive 1 3
#8 Camaro Z28 4 3

关于r - 在 dplyr 中,如何通过可能存在或可能不存在的列连接数据帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66285686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com