R 使用多个条件合并多个柱

R 使用多个条件合并多个柱,r,dplyr,R,Dplyr,我试图使用多个条件语句合并多个列。在下面的例子中,我想与A合并,A优先于B,然后是C,其中A大于等于0.1且小于30,而A是NA,30,我想与B合并,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_re

我试图使用多个条件语句合并多个列。在下面的例子中,我想与A合并,A优先于B,然后是C,其中A大于等于0.1且小于30,而A是NA,<0.1或>30,我想与B合并,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
我试图在下面的代码中使用mutate和coalesce函数来解决这个问题,但没有得到所需的输出(在许多情况下,只要A列中的值是一个值,其中的值是NA,则在输出中会产生null),这就行了

df%

mutate(new_col=if_else(A>=0.1&A您的尝试是正确的,但您需要处理
NA
,因为
if_else
中的
NA
返回
NA

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
库(dplyr)
df%>%

变异(new_col=if_else(A>=0.1&A当

library(dplyr)
df %>%
    mutate(new_col = case_when(A >= 0.1 & A <= 30 & !is.na(A) ~ 
                   coalesce(A, B, C), TRUE ~ coalesce(B, A, C)))
库(dplyr)
df%>%

变异(新列=情况)(A>=0.1&A您添加列
A
B
C
作为列表有什么特别的原因吗?没有,我只是想生成一个数据帧作为示例,我意识到可能有一种简单的方法来实现这一点。是的,用
C
替换
list
。为什么第6行
8.1
,不应该是0。01因为顺序是B->A->C,第2行应该是50.1,因为
0.04<0.1
谢谢Ronak,我编辑了这篇文章,所以列表现在是C
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
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))
library(dplyr)
df %>%
    mutate(new_col = case_when(A >= 0.1 & A <= 30 & !is.na(A) ~ 
                   coalesce(A, B, C), TRUE ~ coalesce(B, A, C)))