Создайте новый столбец с помощью двух условий

#r #dplyr #plyr

Вопрос:

Я хочу создать новый столбец различий путем разности как diff= value1-value3 для не пропущенных значений value3 или diff= value1-value2, если только значение 3 равно NA.

 data<-data.frame(id=c(1,2,3,4,5,6,7,8),
                value1=c(10,12,11,15,16,14,14,11),
                value2=c(9,5,6,10,8,10,6,8),
                value3=c(4,8,7,NA,9,NA,5,NA))
 

Желаемый результат:

  id value1 value2 value3 diff
   1    10    9    4    6
   2    12    5    8    4
   3    11    6    7    4
   4    15   10    NA   5
   5    16   8     9    7
   6    14   10    NA   4
   7    14   6     5    9
   8    11   8     NA   3
   
 

Ответ №1:

В dplyr вы можете использовать coalesce , чтобы получить значение, отличное от NA, между value3 и value2 .

 library(dplyr)

data %>% mutate(diff = value1 - coalesce(value3, value2))

#  id value1 value2 value3 diff
#1  1     10      9      4    6
#2  2     12      5      8    4
#3  3     11      6      7    4
#4  4     15     10     NA    5
#5  5     16      8      9    7
#6  6     14     10     NA    4
#7  7     14      6      5    9
#8  8     11      8     NA    3
 

В базе R с ifelse

 transform(data, diff = value1 - ifelse(is.na(value3), value2, value3))
 

и data.table имеет fcoalesce .

 library(data.table)
setDT(data)[, diff := value1 - fcoalesce(value3, value2)]
 

Комментарии:

1. Спасибо, @Ronak Shah. Работает ли это для дат, отличных от значений?

2. Да, это также должно работать с датами.

3. Можете ли вы отредактировать свой пост, чтобы добавить воспроизводимый пример, чтобы облегчить помощь ?

Ответ №2:

Мы можем использовать

 library(dplyr)
data %>%
    mutate(diff = value1 - case_when(is.na(value3) ~ value2, TRUE ~ value3))
  id value1 value2 value3 diff
1  1     10      9      4    6
2  2     12      5      8    4
3  3     11      6      7    4
4  4     15     10     NA    5
5  5     16      8      9    7
6  6     14     10     NA    4
7  7     14      6      5    9
8  8     11      8     NA    3