r-基于一列从多个表条件联接

  • 本文关键字:条件 于一列 r join dplyr
  • 更新时间 :
  • 英文 :


我试图实现的基本上相当于Excel中的vlookup,它使用if语句来根据给定列的值确定要使用哪个表。

主数据集如下所示:

#STATE  CODE  AMOUNT
#  NJ    1     88
#  DE    2     75
#  VA    1     24
#  PA    1     32

然后,我需要使用其他一些表进行查找,以添加因子列,具体取决于状态——有些状态是唯一的,其余的都使用一个公共表。例如(实际的表格比这个长得多(:

NJ:

#CODE FACTOR
# 1    0.75
# 2    0.90

PA:

#CODE FACTOR
1    0.80
2    0.95

所有其他:

#CODE FACTOR
1    0.82
2    0.93

因此,最终输出将是:

#STATE  CODE  AMOUNT  FACTOR
#  NJ    1     88      0.75
#  DE    2     75      0.93   
#  VA    1     24      0.82
#  PA    1     32      0.80

在这个例子中,有没有一种方法可以根据State的值有条件地从各种因子表中联接/查找?或者我需要将因子表合并为一个表,并明确列出每个状态/因子组合,然后根据状态和代码进行联接?谢谢你的帮助。

如果数据存在于一个数据帧中,那么就更容易了,而不是为每个状态拥有不同的数据帧。

这里有一种方法-

library(dplyr)
combined_states <- bind_rows(lst(NJ, PA, other), .id = "STATE") 
main %>%
mutate(STATE_temp = replace(STATE, 
!STATE %in% unique(combined_states$STATE), 'other')) %>%
left_join(combined_states, by = c('STATE_temp' = 'STATE', 'CODE')) %>%
select(-STATE_temp)
#  STATE  CODE AMOUNT FACTOR
#  <chr> <dbl>  <dbl>  <dbl>
#1 NJ        1     88   0.75
#2 DE        2     75   0.93
#3 VA        1     24   0.82
#4 PA        1     32   0.8 

注意,other数据帧的名称应该与STATE_tempreplaced值相匹配。

数据

main <- tibble(STATE = c('NJ', 'DE', 'VA', 'PA'), 
CODE = c(1, 2, 1, 1), 
AMOUNT = c(88, 75, 24, 32))
NJ <- tibble(CODE = c(1, 2), FACTOR = c(0.75, 0.9))
PA <- tibble(CODE = c(1, 2), FACTOR = c(0.8, 0.95))
other <- tibble(CODE = c(1, 2), FACTOR = c(0.82, 0.93))

使用状态缩写名称列出全局环境中的所有数据帧,将它们绑定到带有state列的单个数据帧中,然后连接到主数据集。然后,对于剩余的任何内容,我们可以使用rows_patch来填充NA值。

library(dplyr)
state_tables = ls(pattern = paste(state.abb, collapse = "|")) |>
mget() |>
bind_rows(.id = "STATE")
main = main |>
left_join(state_tables, by = c("STATE", "CODE")) |>
rows_patch(other, by = "CODE")
main
#  A tibble: 4 × 4
#   STATE  CODE AMOUNT FACTOR
#   <chr> <dbl>  <dbl>  <dbl>
# 1 NJ        1     88   0.75
# 2 DE        2     75   0.93
# 3 VA        1     24   0.82
# 4 PA        1     32   0.8 

(使用Ronak友好共享的数据(

最新更新