通过两个条件创建新列

Create new column by two conditions

我想通过对 value3 或 diff= value1 -value2[=18 的非缺失值的 diff= value1 -value3 进行差分来创建新的差异列=] 如果只有 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 获取 value3value2 之间的非 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

在基础 R 中 ifelse -

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

data.tablefcoalesce

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