在 df1 和 df2 之间执行 left_join,其中 df2 给出 df1 中连接变量的范围

问题描述 投票:0回答:1

我正在尝试合并两个数据框。

df1
包含公司级数据,其中包含列
company_name
industry_code
。说
df1
看起来像这样:

公司名称 行业代码
A 33
B 43
C 56
D 88

df2
包含
industry_name
min_code
max_code
。说
df2
看起来像这样:

行业名称 最小代码 最大代码
10 19
食物 20 39
护理 40 69
制造 70 99

我想将

df2
行业数据合并到
df1
公司数据。这样,合并后的数据如下所示:

公司名称 行业代码 行业名称
A 33 食物
B 43 护理
C 56 护理
D 88 制造

请参阅下面我失败的尝试:

# first attempt
df1 %>%
left_join(df2, by = c("industry_code" = "min_code"))

# second attempt
df1 %>%
mutate(industry_name = ifelse(between(industry_code, df2$min_code, df2$max_code), df2$industry_name, NA)



r join dplyr merge left-join
1个回答
0
投票

正如乔恩已经说过的,使用 dplyr 最简单的答案是使用

join_by()
:

df1 |>
  left_join(df2, join_by(between(industry_code, min_code, max_code))) |>
  select(-min_code, -max_code)

输出:

# A tibble: 4 × 3
  company_name industry_code industry_name
  <chr>                <dbl> <chr>        
1 A                       33 Food         
2 B                       43 Care         
3 C                       56 Care         
4 D                       88 Manufacturing

第一次尝试的问题是,(我相信您已经知道),行业代码与最低代码不匹配,因此您得到 NA。

如果你稍微尝试一下,第二次尝试的问题就会变得更清楚:

between(c(88, 88, 88, 88), df2$min_code, df2$max_code) # [1] FALSE FALSE FALSE  TRUE

between(c(33, 33, 33, 33), df2$min_code, df2$max_code) # [1] FALSE  TRUE FALSE FALSE

between(c(33, 33, 33, 33, 33), df2$min_code, df2$max_code) 
# Error in between(c(33, 33, 33, 33, 33), df2$min_code, df2$max_code) : 
#  Incompatible vector lengths: length(x)==5 length(lower)==4 length(upper)==4. Each should be either length 1 or the length of the longest.

代码不会根据每个最小值和最大值检查每个行业代码,而是根据第一个最小值和第一个最大值检查第一个行业代码,依此类推。

© www.soinside.com 2019 - 2024. All rights reserved.