2017-12-15 3 views
-1

So habe ich zwei Tabellen:Effiziente Möglichkeit, Daten Merge und Füllen NAs mit inkonsistentem Zeitrahmen

Table1: 
ID Yr  Qty Cum_Qty 
A 2013 3 3 
A 2015 3 6 
A 2016 2 8 
B 2006 1 1 

Table2: 
ID Yr 
A 2013  
A 2014  
A 2015  
A 2016  
A 2017 
B 2016  
B 2017  
C 2016 
C 2017 

Dies ist, was ich erreichen will - ich will Cum_Qty Tabelle 2 und erbe letzte Cum_Qty hinzufügen, wenn ein solches vorhanden ist:

ID Yr Cum_Qty 
A 2013 3 
A 2014 3 
A 2015 6 
A 2016 8 
A 2017 8 
B 2016 1 
B 2017 1 
C 2016 0 
C 2017 0 

wenn ich zur Zeit ein left_join(table2, table1, by = c("ID", "Yr") tun, ich mit NA-Werten in Cum_Qty am Ende, wenn bestimmte Jahr in Tabelle fehlt 2. ich dachte über Lag-Funktion, aber das würde lassen Sie mich mit NAS-Gerät für die ersten Jahresrekord und würde nicht für ID C arbeiten, was fehlt in table1. Ich möchte dplyr::mutate verwenden, damit mein Code in den Rohren bleibt.

Ich denke, ich weiß, wie dies mit 3 ~ 4 Mutate zu tun, aber ich möchte einen Weg finden, um den Code zu vereinfachen. Hat jemand irgendwelche Empfehlungen, was ich tun kann?

Um Tabellen in R zu erstellen:

table_1 <- data.frame(
    ID = c("A", "A", "A", "B"), 
    Yr = c(2013, 2015, 2016, 2006), 
    Qty = c(3, 3, 2, 1)) %>% 
    arrange(ID, Yr) %>% 
    group_by(ID) %>% 
    mutate(Cum_Qty = cumsum(Qty)) 

table_2 <- data.frame(
    ID = c("A", "A", "A", "A", "A", "B", "B", "C", "C"), 
    Yr = c(2013, 2014, 2015, 2016, 2017, 2016, 2017, 2016, 2017)) 

Antwort

1

Vorausgesetzt, dass Sie einige Daten aus table_1 verwenden möchten, die nicht in table_2 ist, ich glaube nicht, dass Sie mit einem left_join beginnen kann. Sie können mit einem full_join beginnen, dann verwenden Sie die na.locf aus dem zoo Paket den letzten nicht-NA-Wert pro ID-Gruppe zu bekommen, bevor ein inner_join nur tun zu halten Reihen in table_2 am Ende:

library(dplyr) 
library(zoo) 
full_join(table_2,table_1,by=c("ID","Yr")) %>% 
group_by(ID) %>% 
arrange(ID,Yr) %>% 
mutate(Cum_Qty = na.locf(Cum_Qty,na.rm=F)) %>% 
mutate(Cum_Qty = ifelse(is.na(Cum_Qty),0,Cum_Qty)) %>% 
select(-Qty) %>% 
inner_join(table_2) 

# A tibble: 9 x 3 
# Groups: ID [?] 
    ID Yr Cum_Qty 
    <chr> <dbl> <dbl> 
1  A 2013  3 
2  A 2014  3 
3  A 2015  6 
4  A 2016  8 
5  A 2017  8 
6  B 2016  1 
7  B 2017  1 
8  C 2016  0 
9  C 2017  0 
+0

Vielen Dank für Deine Antwort! Zoo :: na.locf war mir nicht bekannt. Meine Tabellen sind VIEL größere Datenmengen und ich möchte den Großteil der Datenbearbeitung mit Spark machen; Ich bin mir nicht sicher, ob wenn ich na.locf verwenden würde dplyr/sparklyr automatisch die Funktion obwohl:/ – creativename

+0

Ich bin nicht vertraut mit Sparklyr, so weiß ich nicht, wie Sie darüber gehen könnten. Es scheint, dass sparklyr nur einen begrenzten Bereich von Funktionen unterstützt (https://stackoverflow.com/questions/39494484/sparkr-vs-sparklyr), obwohl einer der Kommentare eine neue Funktion spark_apply() in der neuesten Version erwähnt, Sie Vielleicht möchten Sie sich das ansehen. – Lamia

Verwandte Themen