我试图实现的基本上相当于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_temp
的replace
d值相匹配。
数据
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友好共享的数据(