替换未知类别中的中位数时,在 R 中获取 NA

When replacing medians in an unknown category get NA in R

我有两个数据集

d1=structure(list(et = c("s", "s"), gg = c("d", "d"), hj = c("f", 
"f"), ggh = c("h", "h"), wer = c(23L, 45L)), class = "data.frame", row.names = c(NA, 
-2L))

d2=structure(list(et = c("s", "s"), gg = c("d", "d"), hj = c("f", 
"f"), ggh = c("h", "f"), wer = c(3L, 7L)), class = "data.frame", row.names = c(NA, 
-2L))

我根据以下原则执行更改值:如果在数据集 d2 中,与 d1 相同类别的值 wer 小于或大于 [=18] 的中位数=] 对于 1 上的这个类别,然后在 d2 中输入这个类别中的中值。

为了更清楚我想要什么,对于来自 d1

的这个类别
et  gg  hj  ggh (this categorical vars)
s   d   f   h

wer=34

的中位数

d2 具有相同的类别 s d f h,其中 wer=3,所以 3<34 所以我必须在 34 上更改此值, 但 d2 也有 d1 中不存在的类别 s d f f,因此我们在 d1 中留下未知类别的值。

现在我使用代码

library(dplyr)

d1 %>% 
  group_by(across(-wer)) %>% 
  summarise(wer = median(wer), .groups = "drop") %>% 
  right_join(d2, by = c("et", "gg", "hj", "ggh"), suffix = c("", ".y")) %>% 
  mutate(wer = ifelse(wer >= wer.y, wer, wer.y), .keep = "unused")

它满足了我的需要,但是,对于 d1 中的未知类别,它降低了 NA 结果

  et    gg    hj    ggh     wer
  <chr> <chr> <chr> <chr> <dbl>
1 s     d     f     h        34
2 s     d     f     f        NA

但必须是来自 d2 的此类别的真实值,例如这样

  et    gg    hj    ggh     wer
  <chr> <chr> <chr> <chr> <dbl>
1 s     d     f     h        34
2 s     d     f     f        7

我该如何解决? 感谢您的帮助

比较运算符 returns NA 当有 NA

> 7 > NA
[1] NA

在代码中,我们只需要通过使用is.na

添加条件来对NA进行更正
library(dplyr)
d1 %>% 
   group_by(across(-wer)) %>% 
   summarise(wer = median(wer), .groups = "drop") %>% 
   right_join(d2, by = c("et", "gg", "hj", "ggh"), suffix = c("", ".y")) %>% 
   mutate(wer = ifelse(wer >= wer.y & !is.na(wer), wer, wer.y), .keep = "unused")
# A tibble: 2 × 5
  et    gg    hj    ggh     wer
  <chr> <chr> <chr> <chr> <dbl>
1 s     d     f     h        34
2 s     d     f     f         7