Как создать новую переменную, сравнив две другие переменные - PullRequest
1 голос
/ 09 мая 2019

Мне нужно создать переменную с именем comorbidity на основе значений, присутствующих в двух других переменных, и добавить ее в фрейм данных

Теперь у меня есть фрейм данных с именем диагноз с переменными, как показано ниже

v1 <- c(222,250,255,250.23)

v2 <- c(300,369,400,450)

теперь, если v1 не ч / б 250-250.99 и v2 не ч / б 390-490, тогда значение в новой переменной 0

, если v1 ч / б 250-250.99 и v2 не ч / б390-490, то значение в новой переменной 1

, если v1 не является ч / б 250-250.99 и v2 является ч / б 390-490, то значение в новой переменной 2

, если v1 равно b/ w 250-250.99 и v2 - это ч / б 390-490, затем значение в новой переменной 3

Я пробовал ifelse и написал огромный код, но он не дает желаемой части ответа моего кода ниже

diabetic_maindf$comorbidity_1_2 <- 
if_else((diagnosis$v1 == diagnosis$v2 ),0,

if_else((diagnosis$v1 == 1 | diagnosis$v2 == 0),1, 

if_else((diagnosis$v1 == 0 & diagnosis$v2 == 1),1,

Мне нужен кадр данных с 3-ей переменной следующим образом

v1 <- c(222,250,255,250.23)

v2 <- c(300,369,400,450)

new_var <- c(0,1,2,3)

PS: новичок здесь, не знаю, как писать в табличной форме, извините ....

Ответы [ 2 ]

3 голосов
/ 09 мая 2019

Делать этот шаг за шагом не нужно, если interaction и аналогичные функции существуют:

interaction(v1 >= 250 & v1 <= 250.99, v2 >= 390 & v2 <= 490)
#[1] FALSE.FALSE TRUE.FALSE  FALSE.TRUE  TRUE.TRUE  
#Levels: FALSE.FALSE TRUE.FALSE FALSE.TRUE TRUE.TRUE

c(0,1,2,3)[interaction(v1 >= 250 & v1 <= 250.99, v2 >= 390 & v2 <= 490)]
#[1] 0 1 2 3

Хорошая вещь в этой логике состоит в том, что она будет расширена до n сравнений при записи только n операторов вместо 2^n явных сравнений.

2 голосов
/ 09 мая 2019

Вы можете сделать это, используя комбинацию floor и between с case_when:

v1 <- c(222,250,255,250.23)
v2 <- c(300,369,400,450)
diagnosis <- data.frame(v1=v1, v2=v2)

library(dplyr)
mutate(diagnosis, v3 = case_when(
  floor(v1) == 250 & between(v2,390,490) ~ 3,
  floor(v1) != 250 & between(v2,390,490) ~ 2,
  floor(v1) == 250 & !between(v2,390,490) ~ 1,
  floor(v1) != 250 & !between(v2,390,490) ~ 0
))

Это дает:

      v1  v2 v3
1 222.00 300  0
2 250.00 369  1
3 255.00 400  2
4 250.23 450  3

Если вы хотите сохранить егок новому фрейму данных просто добавьте --> df в конец оператора mutate после окончания )).Преимущество такого подхода - читаемость кода.

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