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 <jdnewmil at
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 <esawiek at
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 <esawiek at
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 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.
>>
>>
>> ______________________________________________
>> 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.
>>
>
> ---------------------------------------------------------------------------
> Jeff Newmiller The ..... ..... Go Live...
> DCN:<jdnewmil at 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
> ---------------------------------------------------------------------------
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 <esawiek at 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 ><jdnewmil at 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 <esawiek at 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 <esawiek at 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 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. >>> >>> >>> ______________________________________________ >>> 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. >>> >> >> >--------------------------------------------------------------------------- >> Jeff Newmiller The ..... ..... Go >Live... >> DCN:<jdnewmil at 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 >> >---------------------------------------------------------------------------
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 <jdnewmil at 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 <esawiek at 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 >><jdnewmil at 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 <esawiek at 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 <esawiek at 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 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. >>>> >>>> >>>> ______________________________________________ >>>> 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. >>>> >>> >>> >>--------------------------------------------------------------------------- >>> Jeff Newmiller The ..... ..... Go >>Live... >>> DCN:<jdnewmil at 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 >>> >>---------------------------------------------------------------------------