Эффективный эквивалент ifelse, но с одним вариантом в R? - PullRequest
0 голосов
/ 15 марта 2020
# Two Ordered Vectors

sequenceA <- c(1, 2, NA, 4)
sequenceB <- c(4, 2, NA, 1) 

df <- data.frame(sequenceA, sequenceB)


sum(ifelse(!is.na(df[1,]), 888, 1) == ifelse(!is.na(df[2,]), 999, 1)) # Number of NA values that are in the same position
#? Number of non-NA values that are in the same position

Допустим, у меня есть два наблюдения в кадре данных, и я хочу сравнить, насколько они похожи. Я хочу знать конкретно две вещи: сколько пропущенных значений для указанных c переменных у них общих и сколько не пропущенных значений для указанных c переменных у них общих .

Из того, что я вижу, ни функции не пересекаются , % в% или match , функции не служат для этой цели, поскольку они не учитывают порядок значения, только если они находятся в наборе.

Я пришел с однострочным решением для проверки значений NA, заменив его числом (в противном случае он просто возвращает NA). Затем я хочу сравнить только перекрытия между значениями, не относящимися к NA, поэтому я хотел бы заменить NA для sequenceA одним значением-заполнителем (например, "555") и NA для sequenceB с одним другим значением заполнителя (например, "666").

Я ищу решение для одной строки: если был эквивалент ifelse без else или ничего не делать Я легко это вижу. Большинство подобных вопросов, которые касаются этого, получают ответ, просто поднабор вектора и переназначение ( <- </strong>) значения или использование команд if () {} , которые делают решение слишком длинное (особенно если это то, что я обычно хочу сделать). Я пропускаю оптимальное решение хорошей практики в R для такого рода проблемы?

1 Ответ

1 голос
/ 15 марта 2020

Чтобы получить пропущенные значения для указанных c общих переменных, вы можете использовать

sum(is.na(df$sequenceA) & is.na(df$sequenceB))
#[1] 1

Это также может быть прочитано как число NA значений, которые находятся в той же позиции.


Чтобы узнать, сколько не пропущенных значений для определенных c переменных у них общих

sum(!is.na(df$sequenceA) & !is.na(df$sequenceB))
#[1] 3

Это также может быть прочитано как число не NA значений которые находятся в том же положении.


Чтобы проверить то же значение, мы можем сделать

sum(df$sequenceA == df$sequenceB, na.rm = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...