如何使用两列进行条件交换?

4

如果 BLOOD_PRESSURE_SYSTOLIC <= BLOOD_PRESSURE_DIASTOLIC,我希望交换2列的值。

数据:

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个回答

4

使用基础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

2
您可以添加一个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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接