Используя R, если значения в любой из переменных A или B равны 'NA', использовать вместо этого значения в переменных C и D? - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь вычислить среднее значение двух переменных и вывести его как новую переменную.Например:

data$Average <- (data$Visit1 + data$Visit2) / 2

Однако есть значения NA для переменных «Визит 1» и «Визит 2» в наборе данных.

Как я могу написать некоторый код, чтобы я мог определить, существуют ли значения NA в или Посещении 1 или 2, тогда я использовал бы значения соответствующих строк, но для «Посещения 3»и вместо этого «Посещение 4», чтобы рассчитать среднее?И если значения «Посещение 3» и «Посещение 4» были равны NA, использовать вместо этого «Посещение 5» и «Посещение 6»?

В основном, приоритет заключается в использовании данных Посещений 1 и 2, но если этине существует (NA), чтобы использовать посещения 3 и 4, и, наконец, последний приоритет - посещения 5 и 6.

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 29 мая 2019

Вы можете использовать coalesce() из dplyr. coalesce() будет использовать первое непропущенное значение в каждой позиции. Я думаю, что это имеет лучшую читаемость, чем ifelse() или case_when().

data %>% 
  mutate(
    Average = coalesce(
      as.numeric((data$Visit1 + data$Visit2) / 2),
      as.numeric((data$Visit3 + data$Visit4) / 2),
      as.numeric((data$Visit5 + data$Visit6) / 2)
    )
  )
0 голосов
/ 29 мая 2019

Хороший способ сделать несколько ifelse операторов с case_when

library(dplyr)

dat <- dat %>%
   mutate(
     average = case_when(
     !is.na(Visit1) & !is.na(Visit2) ~ (Visit1 + Visit2)/2,
     !is.na(Visit3) & !is.na(Visit4) ~ (Visit3 + Visit4)/2,
     !is.na(Visit5) & !is.na(Visit6) ~ (Visit5 + Visit6)/2,
     TRUE ~ NA
     )
   )

Преимущества этого подхода: а) использует tidyverse и применима ко многим случаям нескольких операторов ifelse, б) легко понять, когда вы позже вернетесь к коду, в) использовать NA, если некоторые строки не удовлетворяют вашим условиям (т. е. TRUE ~ NA)

Дополнительную документацию по case_when можно найти здесь: https://dplyr.tidyverse.org/reference/case_when.html

0 голосов
/ 29 мая 2019

Вот еще один вариант для вашего отредактированного вопроса, использующий dplyr::case_when для фильтрации возможностей:

library(dplyr)

data$Average <- case_when(!is.na(data$Visit1) & !is.na(data$Visit2) ~ 
                                        (data$Visit1 + data$Visit2) / 2,
                          !is.na(data$Visit3) & !is.na(data$Visit4) ~ 
                                        (data$Visit3 + data$Visit4) / 2,
                          TRUE ~ (data$Visit1 + data$Visit2) / 2)

Это похоже на ifelse, но может обрабатывать более 2 случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...