[R] Replace NAs in split lists

Jeff Newmiller jdnewmil at dcn.davis.ca.us
Mon Jan 8 07:36:47 CET 2018


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.



More information about the R-help mailing list