R语言 如何根据N/A进行查找

aydmsdu9  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(161)

我有一个像这样的10 K的主表,一些行在不同的列中缺少N/A字段。
| 姓名|品牌|国家|颜色|
| --------------|--------------|--------------|--------------|
| 乔治|三星|不适用|蓝色|
| 玛丽|不适用|美国|不适用|
| 莎拉|诺基亚|美国|绿色|
我还有一张这样的table。
| 姓名|品牌|
| --------------|--------------|
| 玛丽|诺基亚|
(And另一个表用于颜色,另一个表用于国家)
我想说的是,如果玛丽的N/A为空白,则在brand表中查找她的值。如果她的Color为空白,则在color表中查找她的值。对于乔治和他的国家/地区的N/A也是如此。出于本练习的目的,我不想覆盖任何现有字段(例如,我想为George保留Samsung和Blue,而不是替换它们)。
已尝试left_join,但不确定如何结合执行if语句

cu6pst1q

cu6pst1q1#

试试这个:
让我们首先构建测试数据。

library(tibble)
library(dplyr)

tb_origin <- 
  tb_base %>% 
  mutate(
    vs = na_if(vs, 0),
    am = na_if(am, 1),
    gear = na_if(gear, 3)
  )
tb_new <- tb_base %>% select(car, vs, am, gear)

tb_origin看起来像这样:

tb_origin
> tb_origin
# A tibble: 32 × 4
   car                  vs    am  gear
   <chr>             <dbl> <dbl> <dbl>
 1 Mazda RX4            NA    NA     4
 2 Mazda RX4 Wag        NA    NA     4
 3 Datsun 710            1    NA     4
 4 Hornet 4 Drive        1     0    NA
 5 Hornet Sportabout    NA     0    NA
 6 Valiant               1     0    NA
 7 Duster 360           NA     0    NA
 8 Merc 240D             1     0     4
 9 Merc 230              1     0     4
10 Merc 280              1     0     4
# ℹ 22 more rows
# ℹ Use `print(n = ...)` to see more rows

您使用left_join()比较数据是正确的,以下是如何使用它:

left_join(tb_origin, tb_new, by = "car", suffix = c(".x" = "", ".y" = "_new"))
# A tibble: 32 × 7
   car                  vs    am  gear vs_new am_new gear_new
   <chr>             <dbl> <dbl> <dbl>  <dbl>  <dbl>    <dbl>
 1 Mazda RX4            NA    NA     4      0      1        4
 2 Mazda RX4 Wag        NA    NA     4      0      1        4
 3 Datsun 710            1    NA     4      1      1        4
 4 Hornet 4 Drive        1     0    NA      1      0        3
 5 Hornet Sportabout    NA     0    NA      0      0        3
 6 Valiant               1     0    NA      1      0        3
 7 Duster 360           NA     0    NA      0      0        3
 8 Merc 240D             1     0     4      1      0        4
 9 Merc 230              1     0     4      1      0        4
10 Merc 280              1     0     4      1      0        4
# ℹ 22 more rows
# ℹ Use `print(n = ...)` to see more rows

下面是如何用你的规则替换NA

tb_result <- 
  tb_origin %>% 
  mutate(
    across(
      .cols = c(vs, am, gear),
      .fns = ~ if_else(!is.na(.x), .x, tb_new[[cur_column()]])
    )
  )
tb_result
> tb_result
# A tibble: 32 × 4
   car                  vs    am  gear
   <chr>             <dbl> <dbl> <dbl>
 1 Mazda RX4             0     1     4
 2 Mazda RX4 Wag         0     1     4
 3 Datsun 710            1     1     4
 4 Hornet 4 Drive        1     0     3
 5 Hornet Sportabout     0     0     3
 6 Valiant               1     0     3
 7 Duster 360            0     0     3
 8 Merc 240D             1     0     4
 9 Merc 230              1     0     4
10 Merc 280              1     0     4
# ℹ 22 more rows
# ℹ Use `print(n = ...)` to see more rows

以下是最后的比较:

> left_join(tb_origin, tb_new, by = "car", suffix = c(".x" = "", ".y" = "_new")) %>% 
+   left_join(tb_result, by = "car", suffix = c(".x" = "", ".y" = "_after_replace"))
# A tibble: 32 × 10
   car           vs    am  gear vs_new am_new gear_new vs_after_replace am_after_replace gear_after_replace
   <chr>      <dbl> <dbl> <dbl>  <dbl>  <dbl>    <dbl>            <dbl>            <dbl>              <dbl>
 1 Mazda RX4     NA    NA     4      0      1        4                0                1                  4
 2 Mazda RX4…    NA    NA     4      0      1        4                0                1                  4
 3 Datsun 710     1    NA     4      1      1        4                1                1                  4
 4 Hornet 4 …     1     0    NA      1      0        3                1                0                  3
 5 Hornet Sp…    NA     0    NA      0      0        3                0                0                  3
 6 Valiant        1     0    NA      1      0        3                1                0                  3
 7 Duster 360    NA     0    NA      0      0        3                0                0                  3
 8 Merc 240D      1     0     4      1      0        4                1                0                  4
 9 Merc 230       1     0     4      1      0        4                1                0                  4
10 Merc 280       1     0     4      1      0        4                1                0                  4
# ℹ 22 more rows
# ℹ Use `print(n = ...)` to see more rows

相关问题