根据R中的优先级从三列中取值

Take the values from three column based on priority in R

我有一个如下所示的数据集,基本上我想要一个最后一列(标记输出)如果存在于 C 列中则取值,如果不存在则在 B 中然后在 A 中,我认为它可以用 ifelse 完成但我是寻找一个整洁的解决方案。如果不是,那么 ifelse 也可以。

structure(list(a = c(1L, 2L, 12L, NA, NA), b = c(3L, 2L, NA, 
NA, 4L), c = c(NA, 5L, NA, 6L, 2L), Output = c(3L, 5L, 12L, 6L, 
2L)), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"
))

我们可以使用coalesce

library(dplyr)
df1 %>%
    mutate(Output = coalesce(!!! .[3:1]))
# A tibble: 5 x 4
#      a     b     c Output
#  <int> <int> <int>  <int>
#1     1     3    NA      3
#2     2     2     5      5
#3    12    NA    NA     12
#4    NA    NA     6      6
#5    NA     4     2      2

df1 %>%
     mutate(Output = coalesce(c, b, a))

或使用case_when

df1 %>% 
      mutate(Output = case_when(!is.na(c)~ c, !is.na(b) ~ b, TRUE ~ a))

base R中,我们也可以做到

as.data.frame(df1[1:3])[cbind(seq_len(nrow(df1)), 
              max.col(!is.na(df1[1:3]), 'last'))]
#[1]  3  5 12  6  2