2017-03-12 7 views
0

Ich habe einen Datenrahmen mit doppelten Speicher/Produkt-Kombinationen. Ich möchte die doppelten Werte entfernen, aber ich möchte die Kosten für diese Produkte für jedes Jahr behalten.Duplikate entfernen, aber Werte in R halten

Beispiel Datenrahmen:

store product year1 year2 year3 
H&M  shirt  20.00 29.95 NA 
Mango trousers 49.95 NA  NA 
H&M  trousers 39.95 NA  39.95 
Mango trousers NA  NA  44.95 

Wie ich das Daten-Set aussehen soll:

store product year1 year2 year3 
H&M  shirt  20.00 29.95 NA 
H&M  trousers 39.95 NA  39.95 
Mango trousers 49.95 NA  44.95 

Ich habe verwendet dplyr aber dies schien nur die Duplikate zu entfernen, sondern alle Kosten Werte zu halten . Jede Hilfe wird geschätzt!

reproduzierbaren Code:

df <- data.frame(store= c("H&M", "Mango", "H&M", "Mango"), product=c("shirt", "trousers", "trousers", "trousers"), 
       year1=c(20.95, 49.95, 39.95, NA), year2=c(29.95, NA, NA, NA), year3=c(NA,NA,39.95, 44.95)) 

Antwort

1

Tat dplyr ist der Weg zu gehen. Erste gather() Sie die Daten, dann sind Sie group_by() und summarize() und schließlich spread() es zurück, mit NAs Füllung wo fehlt, das heißt:

library(dplyr) 
df <- data.frame(store= c("H&M", "Mango", "H&M", "Mango"), 
       product=c("shirt", "trousers", "trousers", "trousers"), 
       year1=c(20.95, 49.95, 39.95, NA), 
       year2=c(29.95, NA, NA, NA), 
       year3=c(NA,NA,39.95, 44.95)) 
new.df <- df %>% 
    gather(year, value, -store, -product) %>% 
    group_by(year, store, product) %>% 
    summarize(sum.value = sum(value)) %>% 
    spread(key = year, value = sum.value, fill = NA) 

Mit -store und -product Tells gather() diese beiden Variablen zu ignorieren und die Daten von Jahr sammeln und rufen Sie die neue Zahlenspalte "value" auf (Sie können dies durch einen beliebigen Namen ersetzen).

Dann group_by() und summarize() stellen sicher, dass wir laufen nicht in Duplikate (und die Summe von zwei Werten verwenden, falls es im Zusammenhang viele Zeilen auf den gleichen Speicher und Produkt).

Schließlich spread() gibt das Formular, das Sie suchen.

Sie müssen vorsichtig sein mit, wie Sie behandeln Duplikate und was Sie davon ausgehen. Diese Antwort geht davon aus, dass, wenn zwei Zeilen mit dem gleichen Produkt und der gleichen Speicherung zweimal vorkommen, der gewünschte Wert die Summe von Jahr1, Summe von Jahr2 und Summe von Jahr3 ist. Wenn NAs vorhanden ist (in den group_by() Gruppen sind, erhalten Sie eine NA als Ergebnis erhalten, es sei denn, Sie na.rm = TRUE in der Summe Befehl hinzufügen, das heißt:.. summarize(sum.value = sum(value, na.rm = TRUE)) Dann werden Sie 0s statt NAs haben

jedoch den Code I geliefert funktioniert für das Beispiel, das Sie geliefert haben, und gibt die gewünschte tibble zurück

1

können Sie das Paket dplyr verwenden.

dfn<- df %>% 
    group_by(store, product) %>% 
    summarise(year1 = sum(year1, na.rm = T), 
      year2 = sum(year2, na.rm = T), 
      year3 = sum(year3, na.rm = T)) 

Wenn Sie dfn ausdrucken, erhalten Sie

store product year1 year2 year3 
    <fctr> <fctr> <dbl> <dbl> <dbl> 
1 H&M shirt 20.95 29.95 0.00 
2 H&M trousers 39.95 0.00 39.95 
3 Mango trousers 49.95 0.00 44.95 

Sie gruppieren durch zwei Variablen gesucht, so dass die group_by Funktion ist am besten für sie geeignet ist. Ich weiß, dass Sie NAs wollen, wo die 0er sind, und Sie können das in einer nachfolgenden Zeile ersetzen

dfn[dfn == 0, ] <- NA 
Verwandte Themen