1

我有一个如下数据集,基本上我想要一个最后一列(标记为输出),如果存在于 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"
))
4

1 回答 1

1

我们可以用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
于 2020-01-25T17:09:11.363 回答