Как сделать условный обмен с использованием двух столбцов? - PullRequest
0 голосов
/ 29 июня 2018

Я хотел бы поменять местами значения 2 столбцов, если BLOOD_PRESSURE_SYSTOLIC <= BLOOD_PRESSURE_DIASTOLIC.

Данные:

df <- data.frame(ID = 1:5, BLOOD_PRESSURE_SYSTOLIC = c(35, 66, NA, 104, 139), BLOOD_PRESSURE_DIASTOLIC = c(98, 46, 160, 159, NA))
# ID BLOOD_PRESSURE_SYSTOLIC BLOOD_PRESSURE_DIASTOLIC
# 1  1                      35                       98
# 2  2                      66                       46
# 3  3                      NA                      160
# 4  4                     104                      159
# 5  5                     139                       NA

Требуемые данные:

# ID BLOOD_PRESSURE_SYSTOLIC BLOOD_PRESSURE_DIASTOLIC
# 1  1                      98                       35
# 2  2                      66                       46
# 3  3                      NA                      160
# 4  4                     159                      104
# 5  5                     139                       NA

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

library(dplyr)
df %>%
      mutate(BLOOD_PRESSURE_SYSTOLIC2  = if_else(BLOOD_PRESSURE_SYSTOLIC <= BLOOD_PRESSURE_DIASTOLIC, BLOOD_PRESSURE_DIASTOLIC, BLOOD_PRESSURE_SYSTOLIC),
             BLOOD_PRESSURE_DIASTOLIC2 = if_else(BLOOD_PRESSURE_SYSTOLIC <= BLOOD_PRESSURE_DIASTOLIC, BLOOD_PRESSURE_SYSTOLIC, BLOOD_PRESSURE_DIASTOLIC)) %>%
      select(ID, BLOOD_PRESSURE_SYSTOLIC = BLOOD_PRESSURE_SYSTOLIC2, BLOOD_PRESSURE_DIASTOLIC = BLOOD_PRESSURE_DIASTOLIC2)

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Вы можете добавить NA условие:

library(dplyr)

df <- data.frame(ID = 1:5, BPS = c(35, 66, NA, 104, 139), BPD = c(98, 46, 160, 159, NA))

df %>%
  mutate(x = if_else(!is.na(BPD) & BPS <= BPD, BPD, BPS),
         y = if_else(!is.na(BPS) & BPS <= BPD, BPS, BPD)) %>%
  select(ID, BPS = x, BPD = y)

Выход:

> df
  ID BPS BPD
1  1  98  35
2  2  66  46
3  3  NA 160
4  4 159 104
5  5 139  NA
0 голосов
/ 29 июня 2018

С базой R:

i <- which(df$BLOOD_PRESSURE_SYSTOLIC <= df$BLOOD_PRESSURE_DIASTOLIC)

v1 <- df$BLOOD_PRESSURE_DIASTOLIC[i]
v2 <- df$BLOOD_PRESSURE_SYSTOLIC[i]

df$BLOOD_PRESSURE_SYSTOLIC[i] <- v1
df$BLOOD_PRESSURE_DIASTOLIC[i] <- v2

Результат:

> df
  ID BLOOD_PRESSURE_SYSTOLIC BLOOD_PRESSURE_DIASTOLIC
1  1                      98                       35
2  2                      66                       46
3  3                      NA                      160
4  4                     159                      104
5  5                     139                       NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...