如何使用最有效的方法将主数据集中的NA值更新/替换为查找表中(正确的)值? 这是一个非常常见的操作!类似的问题似乎没有简洁的解决方案。
限制条件: 1)请假设有大量的缺失值和比给出示例更大的查找表。因此,逐个替换操作将不切实际(没有case_when,if_else等)。 2)查找表没有主数据框中所有的值,仅有替换值。
推荐使用Tidyverse解决方案。类似问题似乎没有简洁的解决方案。
限制条件: 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包 (v0.2.0)于2018年07月28日创建。
coalesce
中定义,如果您不想指定许多列名,则可以以编程方式应用它。 - alistaireleft_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)
- Nettle