#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