[R] assign NA to rows by test on multiple columns of a data frame

Rui Barradas ruipbarradas at sapo.pt
Wed Nov 22 13:59:03 CET 2017


Hello,

Sorry, I obviously read in a hurry.


icol <- grepl("flag", names(mydf))
is.na(mydf[!icol]) <- mydf[icol] == 0

mydf
#   A A_flag  B B_flag
#1  8     10  5     12
#2 NA      0  6      9
#3 10      1 NA      0
#4 NA      0  1      5
#5  5      2 NA      0


Hope this helps,

Rui Barradas

On 11/22/2017 11:19 AM, Massimo Bressan wrote:
> ...well, I don't think this is exactly the expected result (see my post)
> 
> to be noted that the columns affected should be "A" and "B"
> 
> thanks for the help
> 
> max
> 
> ----- Messaggio originale -----
> Da: "Rui Barradas" <ruipbarradas at sapo.pt>
> A: "Massimo Bressan" <massimo.bressan at arpa.veneto.it>, "r-help" <r-help at r-project.org>
> Inviato: Mercoledì, 22 novembre 2017 11:49:08
> Oggetto: Re: [R] assign NA to rows by test on multiple columns of a data frame
> 
> Hello,
> 
> Try the following.
> 
> 
> icol <- which(grepl("flag", names(mydf)))
> mydf[icol] <- lapply(mydf[icol], function(x){
>           is.na(x) <- x == 0
>           x
>       })
> 
> mydf
> #   A A_flag B B_flag
> #1  8     10 5     12
> #2  7     NA 6      9
> #3 10      1 2     NA
> #4  1     NA 1      5
> #5  5      2 0     NA
> 
> 
> Hope this helps,
> 
> Rui Barradas
> 
> On 11/22/2017 10:34 AM, Massimo Bressan wrote:
>>
>>
>> Given this data frame (a simplified, essential reproducible example)
>>
>>
>>
>>
>> A<-c(8,7,10,1,5)
>>
>> A_flag<-c(10,0,1,0,2)
>>
>> B<-c(5,6,2,1,0)
>>
>> B_flag<-c(12,9,0,5,0)
>>
>>
>>
>>
>> mydf<-data.frame(A, A_flag, B, B_flag)
>>
>>
>>
>>
>> # this is my initial df
>>
>> mydf
>>
>>
>>
>>
>> I want to get to this final situation
>>
>>
>>
>>
>> i<-which(mydf$A_flag==0)
>>
>> mydf$A[i]<-NA
>>
>>
>>
>>
>> ii<-which(mydf$B_flag==0)
>>
>> mydf$B[ii]<-NA
>>
>>
>>
>>
>> # this is my final df
>>
>> mydf
>>
>>
>>
>>
>> By considering that I have to perform this task in a data frame with many columns I’m wondering if there is a compact and effective way to get the final result with just one ‘sweep’ of the dataframe?
>>
>>
>>
>>
>> I was thinking to the function apply or lapply but I can not properly conceive how to…
>>
>>
>>
>>
>> any hint for that?
>>
>> 	[[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>



More information about the R-help mailing list