Reputation: 1644
I would like to swap values of 2 columns if BLOOD_PRESSURE_SYSTOLIC <= BLOOD_PRESSURE_DIASTOLIC
.
Data:
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
Desired Data:
# 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
Code: I came up with the following code, but it doesn't output the results that I want (esp. in handling the missing values) and it is not really human-readable.
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)
Upvotes: 4
Views: 630
Reputation: 2995
You can add a NA
condition:
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)
Output:
> df
ID BPS BPD
1 1 98 35
2 2 66 46
3 3 NA 160
4 4 159 104
5 5 139 NA
Upvotes: 2
Reputation: 4187
With base 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
The result:
> 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
Upvotes: 4