如果另一个变量等于R中的设定值,如何用不同变量的值创建一个新变量?

Hei*_*rch -1 conditional r subset conditional-statements

我有一个复杂的问题,我将通过简化我的数据集来尝试简化.说我有5个变量:

df$Id <- c(1:12)
df$Date <- c(NA,NA,a,a,b,NA,NA,b,c,c,b,a)
df$va <- c(1.1, 1.4, 2.5, ...)     #12 randoms values
df$vb <- c(5.9, 2.3, 4.7, ...)     #12 other random values
df$vc <- c(3.0, 3.3, 3.7, ...)     #12 more random values
Run Code Online (Sandbox Code Playgroud)

然后我想创建一个新变量,如果日期等于a,b或c,则从va,vb或vc获取值.我曾尝试过嵌套的if-else,但是没有用.我也尝试过:

df$new[df$date=='a' & !is.na(df$date)] <- df$va
df$new[df$date=='b' & !is.na(df$date)] <- df$vb
df$new[df$date=='c' & !is.na(df$date)] <- df$vc
Run Code Online (Sandbox Code Playgroud)

这正确地将NA保留在新变量中,其中Date = NA,但是提供的值不是来自va,vb或vc,而是一些其他值.如果日期为'a',如果日期为'b',如果日期为'c',则如何获得等于va的df $ new;如果日期为'c',则为vc?

Exp*_*teR 5

尝试

library(dplyr)
df %>% 
    mutate(new = (Date=="a")*va + (Date=="b")*vb + (Date=="c")*vc)
#   Id Date         va        vb         vc       new
#1   1 <NA> 0.26550866 0.6870228 0.26722067        NA
#2   2 <NA> 0.37212390 0.3841037 0.38611409        NA
#3   3    a 0.57285336 0.7698414 0.01339033 0.5728534
#4   4    a 0.90820779 0.4976992 0.38238796 0.9082078
#5   5    b 0.20168193 0.7176185 0.86969085 0.7176185
#6   6 <NA> 0.89838968 0.9919061 0.34034900        NA
#7   7 <NA> 0.94467527 0.3800352 0.48208012        NA
#8   8    b 0.66079779 0.7774452 0.59956583 0.7774452
#9   9    c 0.62911404 0.9347052 0.49354131 0.4935413
#10 10    c 0.06178627 0.2121425 0.18621760 0.1862176
#11 11    b 0.20597457 0.6516738 0.82737332 0.6516738
#12 12    a 0.17655675 0.1255551 0.66846674 0.1765568
Run Code Online (Sandbox Code Playgroud)

要么,

library(data.table)
setDT(df)[,new:= (Date=="a")*va + (Date=="b")*vb + (Date=="c")*vc,]
Run Code Online (Sandbox Code Playgroud)

数据

set.seed(1)
df <- data.frame(Id = 1:12,
                 Date = c(NA,NA,"a","a","b",NA,NA,"b","c","c","b","a"),
                 va = runif(12),
                 vb = runif(12),
                 vc = runif(12), stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)