[R] Replace NAs in split lists

Eric Berger
2018-01-08T14:41:33Z

You can enforce these assumptions by sorting on multiple columns, which
leads to

na.locf(df1[ order(df1$ID,df1$Value), ])



On Mon, Jan 8, 2018 at 4:19 PM, Jeff Newmiller <jdnewmil at
dcn.davis.ca.us>
wrote:

> Yes, you are right if the IDs are always sequentially-adjacent and the
> first non-NA value appears in the first record for each ID.
> --
> Sent from my phone. Please excuse my brevity.
>
> On January 8, 2018 2:29:40 AM PST, PIKAL Petr <petr.pikal at
precheza.cz>
> wrote:
> >Hi
> >
> >With the example, na.locf seems to be the easiest way.
> >> library(zoo)
> >
> >> na.locf(df1)
> >  ID ID_2 Firist Value
> >1  a   aa   TRUE     2
> >2  a   ab  FALSE     2
> >3  a   ac  FALSE     2
> >4  b   aa   TRUE     5
> >5  b   ab  FALSE     5
> >
> >Cheers
> >Petr
> >
> >> -----Original Message-----
> >> From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of
Jeff
> >> Newmiller
> >> Sent: Monday, January 8, 2018 9:13 AM
> >> To: r-help at r-project.org; Ek Esawi <esawiek at gmail.com>
> >> Subject: Re: [R] Replace NAs in split lists
> >>
> >> 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
> >>
> >> ______________________________________________
> >> 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.
> >
> >________________________________
> >Tento e-mail a jak?koliv k n?mu p?ipojen? dokumenty jsou d?v?rn? a jsou
> >ur?eny pouze jeho adres?t?m.
> >Jestli?e jste obdr?el(a) tento e-mail omylem, informujte laskav?
> >neprodlen? jeho odes?latele. Obsah tohoto emailu i s p??lohami a jeho
> >kopie vyma?te ze sv?ho syst?mu.
> >Nejste-li zam??len?m adres?tem tohoto emailu, nejste opr?vn?ni tento
> >email jakkoliv u??vat, roz?i?ovat, kop?rovat ?i zve?ej?ovat.
> >Odes?latel e-mailu neodpov?d? za eventu?ln? ?kodu zp?sobenou
> >modifikacemi ?i zpo?d?n?m p?enosu e-mailu.
> >
> >V p??pad?, ?e je tento e-mail sou??st? obchodn?ho jedn?n?:
> >- vyhrazuje si odes?latel pr?vo ukon?it kdykoliv jedn?n? o uzav?en?
> >smlouvy, a to z jak?hokoliv d?vodu i bez uveden? d?vodu.
> >- a obsahuje-li nab?dku, je adres?t opr?vn?n nab?dku bezodkladn?
> >p?ijmout; Odes?latel tohoto e-mailu (nab?dky) vylu?uje p?ijet? nab?dky
> >ze strany p??jemce s dodatkem ?i odchylkou.
> >- trv? odes?latel na tom, ?e p??slu?n? smlouva je uzav?ena teprve
> >v?slovn?m dosa?en?m shody na v?ech jej?ch n?le?itostech.
> >- odes?latel tohoto emailu informuje, ?e nen? opr?vn?n uzav?rat za
> >spole?nost ??dn? smlouvy s v?jimkou p??pad?, kdy k tomu byl p?semn?
> >zmocn?n nebo p?semn? pov??en a takov? pov??en? nebo pln? moc byly
> >adres?tovi tohoto emailu p??padn? osob?, kterou adres?t zastupuje,
> >p?edlo?eny nebo jejich existence je adres?tovi ?i osob? j?m zastoupen?
> >zn?m?.
> >
> >This e-mail and any documents attached to it may be confidential and
> >are intended only for its intended recipients.
> >If you received this e-mail by mistake, please immediately inform its
> >sender. Delete the contents of this e-mail with all attachments and its
> >copies from your system.
> >If you are not the intended recipient of this e-mail, you are not
> >authorized to use, disseminate, copy or disclose this e-mail in any
> >manner.
> >The sender of this e-mail shall not be liable for any possible damage
> >caused by modifications of the e-mail or by delay with transfer of the
> >email.
> >
> >In case that this e-mail forms part of business dealings:
> >- the sender reserves the right to end negotiations about entering into
> >a contract in any time, for any reason, and without stating any
> >reasoning.
> >- if the e-mail contains an offer, the recipient is entitled to
> >immediately accept such offer; The sender of this e-mail (offer)
> >excludes any acceptance of the offer on the part of the recipient
> >containing any amendment or variation.
> >- the sender insists on that the respective contract is concluded only
> >upon an express mutual agreement on all its aspects.
> >- the sender of this e-mail informs that he/she is not authorized to
> >enter into any contracts on behalf of the company except for cases in
> >which he/she is expressly authorized to do so in writing, and such
> >authorization or power of attorney is submitted to the recipient or the
> >person represented by the recipient, or the existence of such
> >authorization is known to the recipient of the person represented by
> >the recipient.
>
> ______________________________________________
> 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.
>

	[[alternative HTML version deleted]]