我正在尝试合并两个数据框。
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)
正如乔恩已经说过的,使用 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.
代码不会根据每个最小值和最大值检查每个行业代码,而是根据第一个最小值和第一个最大值检查第一个行业代码,依此类推。