Because you need to separate the instructions with a ; (semi-colon). Hope this helps Rui Barradas
Enviado a partir do meu smartphone Samsung Galaxy.-------- Mensagem original --------De: Ek Esawi <esaw...@gmail.com> Data: 08/01/2018 16:03 (GMT+00:00) Para: Jeff Newmiller <jdnew...@dcn.davis.ca.us>, r-help@r-project.org Assunto: Re: [R] Replace NAs in split lists Thank you Jeff. Your code works, as usual , perfectly. I am just wondering why if i put the whole code in one line, i get an error message. sdf2 <- lapply( sdf, function(z){z$Value <-ifelse(is.na(z$Value),z$Value[!is.na(z$Value)][1],z$Value)z}) error. unexpected symbol in sdf2 Thanks again EK On Mon, Jan 8, 2018 at 3:12 AM, Jeff Newmiller <jdnew...@dcn.davis.ca.us> wrote: > Upon closer examination I see that you are not using the split version of > df1 as I usually would, so here is a reproducible example: > > #---- > df1 <- read.table( text= > "ID ID_2 Firist Value > 1 a aa TRUE 2 > 2 a ab FALSE NA > 3 a ac FALSE NA > 4 b aa TRUE 5 > 5 b ab FALSE NA > ", header=TRUE, as.is=TRUE ) > > sdf <- split( df1, df1$ID ) > # note the extra [ 1 ] in case you have more than one non-NA value # per ID > sdf2 <- lapply( sdf > , function( z ) { > z$Value <- ifelse( is.na( z$Value ) > , z$Value[ !is.na( z$Value ) ][ 1 ] > , z$Value > ) > z > } > ) > df2 <- do.call( rbind, sdf2 ) > df2 > #> ID ID_2 Firist Value > #> a.1 a aa TRUE 2 > #> a.2 a ab FALSE 2 > #> a.3 a ac FALSE 2 > #> b.4 b aa TRUE 5 > #> b.5 b ab FALSE 5 > > # or using tidyverse methods > > library(dplyr) > #> > #> Attaching package: 'dplyr' > #> The following objects are masked from 'package:stats': > #> > #> filter, lag > #> The following objects are masked from 'package:base': > #> > #> intersect, setdiff, setequal, union > df3 <- ( df1 > %>% group_by( ID ) > %>% do({ > mutate( . > , Value = ifelse( is.na( Value ) > , Value[ !is.na( Value ) ][ 1 ] > , Value > ) > ) > }) > %>% ungroup > ) > df3 > #> # A tibble: 5 x 4 > #> ID ID_2 Firist Value > #> <chr> <chr> <lgl> <int> > #> 1 a aa T 2 > #> 2 a ab F 2 > #> 3 a ac F 2 > #> 4 b aa T 5 > #> 5 b ab F 5 > #---- > > > On Sun, 7 Jan 2018, Jeff Newmiller wrote: > >> Why do you want to modify df1? >> >> Why not just reassemble the parts as a new data frame and use that going >> forward in your calculations? That is generally the preferred approach in R >> so you can re-do your calculations easily if you find a mistake later. >> -- >> Sent from my phone. Please excuse my brevity. >> >> On January 7, 2018 7:35:59 PM PST, Ek Esawi <esaw...@gmail.com> wrote: >>> >>> I just came up with a solution right after i posted the question, but >>> i figured there must be a better and shorter one.than my solution >>> sdf1[[1]][1,4]<-lapplyresults[[1]] >>> sdf1[[2]][1,4]<-lapplyresults[[2]] >>> >>> EK >>> >>> On Sun, Jan 7, 2018 at 10:13 PM, Ek Esawi <esaw...@gmail.com> wrote: >>>> >>>> Hi all-- >>>> >>>> I stumbled on this problem online. I did not like the solution given >>>> there which was a long UDF. I thought why cannot split and l/s apply >>>> work here. My aim is to split the data frame, use l/sapply, make >>>> changes on the split lists and combine the split lists to new data >>>> frame with the desired changes/output. >>>> >>>> The data frame shown below has a column named ID which has 2 >>> >>> variables >>>> >>>> a and b; i want to replace the NAs on the Value column by 2, which is >>>> the only numeric entry, for ID=a and by 5 for ID=b. >>>> >>>> I worked out the solution but could not replace the results in the >>> >>> split lists. >>>> >>>> >>>> Original dataframe , df1 >>>> ID ID_2 Firist Value >>>> 1 a aa TRUE 2 >>>> 2 a ab FALSE NA >>>> 3 a ac FALSE NA >>>> 4 b aa TRUE 5 >>>> 5 b ab FALSE NA >>>> Sdf1 >>>> $a >>>> ID ID_2 Firist Value >>>> 1 a aa TRUE 2 >>>> 2 a ab FALSE NA >>>> 3 a ac FALSE NA >>>> $b >>>> ID ID_2 Firist Value >>>> 4 b aa TRUE 5 >>>> 5 b ab FALSE NA >>>> Desired results >>>> ID ID_2 Firist Value >>>> 1 a aa TRUE 2 >>>> 2 a ab FALSE 2 >>>> 3 a ac FALSE 2 >>>> >>>> $b >>>> ID ID_2 Firist Value >>>> 4 b aa TRUE 5 >>>> 5 b ab FALSE 5 >>>> >>>> My code >>>> >>>> sdf <- split(df1,df$ID) >>>> lapply(sdf, function(z) >>> >>> ifelse(is.na(z$Value),z$Value[!is.na(z$Value)],z$Value)) >>>> >>>> result: >>>> $ a: num [1:3] 2 2 2 >>>> $ b: num [1:2] 5 5 >>>> >>>> How could I put these two lists back in the split data frame, sdf1? >>>> Then I could use do.call to reassemble a data frame from the split >>>> lists, >>>> >>>> Thanks, >>>> EK >>> >>> >>> ______________________________________________ >>> R-help@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. >> >> >> ______________________________________________ >> R-help@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. >> > > --------------------------------------------------------------------------- > Jeff Newmiller The ..... ..... Go Live... > DCN:<jdnew...@dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... > Live: OO#.. Dead: OO#.. Playing > Research Engineer (Solar/Batteries O.O#. #.O#. with > /Software/Embedded Controllers) .OO#. .OO#. rocks...1k > --------------------------------------------------------------------------- ______________________________________________ R-help@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. [[alternative HTML version deleted]] ______________________________________________ R-help@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.