У меня есть два набора данных
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
значение wer
для тех же категорий с d1
меньше или больше медианы из d1
для этой категории на 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 есть категория s d f f
, которая отсутствует в d1, поэтому мы оставили значение для неизвестной категории в 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
Как я могу это исправить? спасибо за помощь
Операторы сравнения возвращают NA
, когда есть NA
> 7 > NA
[1] NA
В коде нам просто нужно сделать поправку на NA
, добавив условие, используя is.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
Замените
ifelse(wer >= wer.y, wer, wer.y)
наcoalesce(ifelse(wer >= wer.y, wer, wer.y), wer.y)
.