r - How to Replace multiple values across a dataframe according to criteria from specific column? -


here dataset:

> data<-read.csv(file.choose()) > data$maxdate<-as.character(data$maxdate) > data$batch<-gsub(" ", "\\.",data$batch) > p<-data[1:5,] > p            managername     employee.name employee.id   maxdate    batch 1 abarrientos,  claire    vinnikov, olga       32403 8/11/2015 batch.47 2         adel, bonnie      adams, tracy      201850                    3         adel, bonnie    black, chantal      213746 7/29/2011 batch.17 4         adel, bonnie  brandoli, morena      201990 7/29/2011 batch.17 5         adel, bonnie campbell, melissa      201931                      x.new.employee.ehs.document.sign.off batch.01 batch.02 batch.03 batch.04 1                                    1       na       na       na       na 2                                   na        1        1        1        1 3                                    1        1        1        1        1 4                                    1        1        1        1        1 5                                   na        1        1        1        1   batch.06 batch.07 batch.08 batch.09 batch.10 batch.11 batch.18 batch.19 1       na       na       na       na       na       na       na       na 2        1        1        1        1        1        1        1        1 3        1        1        1        1        1        1        1        1 4        1        1        1        1        1        1        1        1 5        1        1        1        1        1        1        1        1   batch.20 batch.22 batch.24 batch.25 batch.26 batch.27 batch.28 batch.29 1       na       na       na       na       na       na       na       na 2        1        1        1        1        1        1        1        1 3        1        1        1        1        1        1        1        1 4        1        1        1        1        1        1        1        1 5        1        1        1        1        1        1        1        1   batch.30 batch.31 batch.32 batch.33 batch.34 batch.35 batch.36 batch.37 1       na       na       na       na       na       na       na       na 2        1        1        1        1        1        1        1        1 3        1        1        1        1        1        1        1        1 4        1        1        1        1        1        1        1        1 5        1        1        1        1        1        1        1        1   batch.38 batch.39 batch.40 batch.41 batch.42 batch.43 batch.44 batch.45 1       na       na       na       na       na       na       na       na 2        1        1        1        1        1        1        1        1 3        1        1        1        1        1        1        1        1 4        1        1        1        1        1        1        1        1 5        1       na       na       na       na       na       na       na   batch.46 batch.47 1       na       na 2        1        1 3       na       na 4        1        1 5       na       na 

i'm novice r user , i'm trying figure out how change column values 1 given batch number. example, first row, batch number "batch.47". therefore, want replace values columns "batch.1", "batch.2", "batch.3" , way through "batch.47" "1". however, want rows have value of "1" under new.employee.sign.off column. second row, there no corresponding batch number because "adams, tracy" has "na" under employee sign-off. therefore, want particular row stay same. keep in mind not batch numbers included. example, there no batch number 13 17.

here's code far:

for (i in 1:nrow(p)) {   if (p$x.new.employee.ehs.document.sign.off[i] == 1) {     k<-which(colnames(p)==p$batch[i])     p[i,]<-replace(p[i,],6:k[i],1)     i=i+1   }   else if (is.na(p$x.new.employee.ehs.document.sign.off[i])) {     i=i+1   } } 

this produces following error:

error in if (p$x.new.employee.ehs.document.sign.off[i] == 1) { :    missing value true/false needed 

would appreciate guidance. appreciated , in advance!

here properties of data set:

> str(data) 'data.frame':   3372 obs. of  44 variables:  $ managername                         : factor w/ 209 levels "abarrientos,  claire",..: 1 2 2 2 2 2 2 2 2 2 ...  $ employee.name                       : factor w/ 3371 levels "abas, ma cecilia",..: 3155 14 304 346 455 648 850 934 1021 1089 ...  $ employee.id                         : factor w/ 3368 levels "(blank)","0",..: 3257 278 2025 359 325 3092 1695 2075 1043 1196 ...  $ maxdate                             : chr  "8/11/2015" "" "7/29/2011" "7/29/2011" ...  $ batch                               : chr  "batch.47" "" "batch.17" "batch.17" ...  $ x.new.employee.ehs.document.sign.off: int  1 na 1 1 na 1 1 na na 1 ...  $ batch.01                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.02                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.03                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.04                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.06                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.07                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.08                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.09                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.10                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.11                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.18                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.19                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.20                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.22                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.24                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.25                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.26                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.27                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.28                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.29                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.30                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.31                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.32                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.33                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.34                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.35                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.36                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.37                            : int  na 1 1 1 1 na 1 1 1 1 ...  $ batch.38                            : int  na 1 1 1 1 na na 1 1 1 ...  $ batch.39                            : int  na 1 1 1 na na 1 1 1 1 ...  $ batch.40                            : int  na 1 1 1 na na 1 1 1 1 ...  $ batch.41                            : int  na 1 1 1 na na 1 1 1 1 ...  $ batch.42                            : int  na 1 1 1 na na 1 1 1 1 ...  $ batch.43                            : int  na 1 1 1 na na 1 1 1 1 ...  $ batch.44                            : int  na 1 1 1 na na 1 1 1 1 ...  $ batch.45                            : int  na 1 1 1 na na 1 1 1 1 ...  $ batch.46                            : int  na 1 na 1 na na na na na 1 ...  $ batch.47                            : int  na 1 na 1 na 1 1 1 na na ... >  

colnames(p) -> clnames clnames[grep("batch.", x = clnames)] -> batchvec apply(p[,batchvec], 2,  function(x) ifelse(p$x.new.employee.ehs.document.sign.off == 1, 1, 0) ) -> newp 

then bind newp columns in p don't start "batch" etc..as in..

cbind(p[,"employee.sign"], newp) 

Comments