При замене медиан в неизвестной категории получите NA в 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 значение 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

Как я могу это исправить? спасибо за помощь

Замените ifelse(wer >= wer.y, wer, wer.y) на coalesce(ifelse(wer >= wer.y, wer, wer.y), wer.y).

Martin Gal 09.04.2022 12:17
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
4
1
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Операторы сравнения возвращают 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

Другие вопросы по теме