Я пытаюсь вычислить среднее значение двух переменных и вывести его как новую переменную. Например:
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.
Большое спасибо!
Это, к сожалению, не отвечает на мой вопрос.
Вот еще один вариант вашего отредактированного вопроса с использованием 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
, но может обрабатывать более двух случаев.
Хороший способ сделать несколько утверждений 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, если некоторые строки не удовлетворяют вашим условиям (т.е. , ИСТИНА ~ нет данных)
Дополнительная документация по case_when
находится здесь: https://dplyr.tidyverse.org/reference/case_when.html
Вы можете использовать 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)
)
)
Я бы использовал
rowMeans(data[c("Visit1", "Visit2")], na.rm = TRUE)