I don't get exactly that error message, > ifelse(is.na(z$Value),z$Value[!is.na(z$Value)][1],z$Value)z}) Error: unexpected symbol in "ifelse(is.na(z$Value),z$Value[!is.na (z$Value)][1],z$Value)z" The 'symbol' in "unexpected symbol" refers to a "name" ('z' in this case). The problem is usually at the end of the code snippet shown in the error message as in > f(a)b # missing newline or semicolon? Error: unexpected symbol in "f(a)b" or > f(a b) # missing comma? Error: unexpected symbol in "f(a b"
You need a newline or semicolon between the end of 'ifelse(...)' and 'z' or maybe you don't want the z there at all. After you fix that it will complain about the unmatched right brace and parenthesis. Bill Dunlap TIBCO Software wdunlap tibco.com On Mon, Jan 8, 2018 at 8:55 AM, Ek Esawi <esaw...@gmail.com> wrote: > OPS! Sorry i did indeed posted the code in HTML; should have known better. > > ifelse(is.na(z$Value),z$Value[!is.na(z$Value)][1],z$Value)z}) > error. unexpected symbol in sdf2 > > On Mon, Jan 8, 2018 at 11:44 AM, Jeff Newmiller > <jdnew...@dcn.davis.ca.us> wrote: > > I don't know. You seem to be posting in HTML so your code is mangled. > Can you post plain text and use the reprex package to make sure it produces > the errorin a clean R session? > > -- > > Sent from my phone. Please excuse my brevity. > > > > On January 8, 2018 8:03:45 AM PST, Ek Esawi <esaw...@gmail.com> wrote: > >>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.