我想通过diff= value1 -value3创建新的diff列对于value3或的非缺失值,diff= value1 -value2如果只有value3是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
在dplyr
中,您可以使用coalesce
来获得value3
和value2
之间的非na值。
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
In base R withifelse
-
transform(data, diff = value1 - ifelse(is.na(value3), value2, value3))
和data.table
有fcoalesce
。
library(data.table)
setDT(data)[, diff := value1 - fcoalesce(value3, value2)]
我们可以使用
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