【发布时间】:2019-01-05 10:26:04
【问题描述】:
用查找表中的(正确)值更新/替换主数据集中的 NA 的最有效方法是什么?这是很常见的操作!类似的问题似乎没有整齐的解决方案。
约束:
1)请假设比给出的示例有大量缺失值和更大的查找表。所以按大小写替换操作是不切实际的(没有case_when、if_else 等)
2)查找表没有主数据框的所有值,只有替换值。
Tidyverse 解决方案的答案更受欢迎。类似的问题似乎没有整齐的解决方案。
library(tidyverse)
### Main Dataframe ###
df1 <- tibble(
state_abbrev = state.abb[1:10],
state_name = c(state.name[1:5], rep(NA, 3), state.name[9:10]),
value = sample(500:1200, 10, replace=TRUE)
)
#> # A tibble: 10 x 3
#> state_abbrev state_name value
#> <chr> <chr> <int>
#> 1 AL Alabama 551
#> 2 AK Alaska 765
#> 3 AZ Arizona 508
#> 4 AR Arkansas 756
#> 5 CA California 741
#> 6 CO <NA> 1100
#> 7 CT <NA> 719
#> 8 DE <NA> 874
#> 9 FL Florida 749
#> 10 GA Georgia 580
### Lookup Dataframe ###
lookup_df <- tibble(
state_abbrev = state.abb[6:8],
state_name = state.name[6:8]
)
#> # A tibble: 3 x 2
#> state_abbrev state_name
#> <chr> <chr>
#> 1 CO Colorado
#> 2 CT Connecticut
#> 3 DE Delaware
理想情况下,left_join 将具有缺失值的替换选项。唉……
left_join(df1, lookup_df)
#> Joining, by = c("state_abbrev", "state_name")
#> # A tibble: 10 x 3
#> state_abbrev state_name value
#> <chr> <chr> <int>
#> 1 AL Alabama 551
#> 2 AK Alaska 765
#> 3 AZ Arizona 508
#> 4 AR Arkansas 756
#> 5 CA California 741
#> 6 CO <NA> 1100
#> 7 CT <NA> 719
#> 8 DE <NA> 874
#> 9 FL Florida 749
#> 10 GA Georgia 580
```
由reprex package (v0.2.0) 于 2018 年 7 月 28 日创建。
【问题讨论】:
-
您可以只创建一个完整的查找表并进行合并(左连接)吗?
-
如果查找表多于两列,则为更新连接,在 dplyr (for now) 中不存在。不过,基本功能是在
coalesce中定义的,如果您不想指定大量列名,可以通过编程方式应用。 -
@Ronak:这个问题被标记为重复,虽然链接没有去整洁的解决方案。
-
@alistaire:你的建议,我想?
left_join(df1, lookup_df, by = "state_abbrev") %>% mutate(merged.col = coalesce(df.merged$state_name.x, state_name.y) ) %>% select(state_abbrev, state_name= merged.col, value) -
@alistaire: 立即将其放入 dplyr!