Возьмите значения из трех столбцов на основе приоритета в R - PullRequest
1 голос
/ 25 января 2020

У меня есть набор данных, как показано ниже, в основном я хочу последний столбец (помеченный как выходной), который принимает значение, если присутствует в столбце C, если не в B, то в A, я думаю, что это можно сделать с помощью ifelse, но я ищу аккуратное решение. Если нет, то ifelse также будет работать.

Sample dataset

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"
))

1 Ответ

1 голос
/ 25 января 2020

Мы можем использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...