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