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?
尝试
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)