我正在尝试使用多个条件语句合并多个列。在下面的示例中,我想合并 A 优先于 B,然后是 C,其中 A >= 0.1 和 < 30,而 A 是 NA,< 0.1 或 > 30 我要合并 B 优先于 A,然后是C。
下面是一个示例数据集:
df <- data.frame(1:8)
df$A <- c(102, 0.04, 0.1, NA_real_, 0.01, 0.01, 0.2, NA_real_)
df$B <- c(20.2, 50.1, 10.1, 6.1, 7.1, NA_real_, 8.1, NA_real_)
df$C <- c(NA_real_, 4.1, NA_real_, NA_real_, NA_real_, 8.1, NA_real_, 10.1)
A B C
1 102 20.2 NA
2 0.04 50.1 4.1
3 0.1 10.1 NA
4 NA 6.1 NA
5 0.01 7.1 NA
6 0.01 NA 8.1
7 0.2 8.1 NA
8 NA NA 10.1
Run Code Online (Sandbox Code Playgroud)
以下是所需的输出:
A B C new_col
1 102 20.2 NA 20.2
2 0.04 50.1 4.1 50.1
3 0.1 10.1 NA 0.1
4 NA 6.1 NA 6.1
5 0.01 7.1 NA 7.1
6 0.01 NA 8.1 8.1
7 0.2 8.1 NA 0.2
8 NA NA 10.1 10.1
Run Code Online (Sandbox Code Playgroud)
我尝试在下面的代码中使用 mutate 和合并函数来解决这个问题,但没有得到所需的输出(在许多情况下,只要 A 列中的值是一个值为 NA 的值,就可以正常工作,Nulls 在输出)。
df <- df %>%
mutate(new_col = if_else(A >= 0.1 & A <= 30,
coalesce(A, B, C),
coalesce(B, A, C)))
A B C new_col
1 102 20.2 NA 20.2
2 0.04 50.1 4.1 50.1
3 0.1 10.1 NA 0.1
4 NA 6.1 NA NULL
5 0.01 7.1 NA 7.1
6 0.01 NA 8.1 0.01
7 0.2 8.1 NA 0.2
8 NA NA 10.1 NULL
Run Code Online (Sandbox Code Playgroud)
您的尝试是正确的,但您需要处理NA's 因为NA返回。if_elseNA
library(dplyr)
df %>%
mutate(new_col = if_else(A >= 0.1 & A <= 30 & !is.na(A),
coalesce(A, B, C),
coalesce(B, A, C)))
# A B C new_col
#1 102.00 20.2 NA 20.20
#2 0.04 50.1 4.1 50.10
#3 0.10 10.1 NA 0.10
#4 NA 6.1 NA 6.10
#5 0.01 7.1 NA 7.10
#6 0.01 NA 8.1 0.01
#7 0.20 8.1 NA 0.20
#8 NA NA 10.1 10.10
Run Code Online (Sandbox Code Playgroud)
数据
df <- data.frame(A = c(102, 0.04, 0.1, NA_real_, 0.01, 0.01, 0.2, NA_real_),
B = c(20.2, 50.1, 10.1, 6.1, 7.1, NA_real_, 8.1, NA_real_),
C = c(NA_real_, 4.1, NA_real_, NA_real_, NA_real_, 8.1, NA_real_, 10.1))
Run Code Online (Sandbox Code Playgroud)