2017-12-23 5 views
3

Ich habe ein R-Datenverarbeitungsproblem. Ich habe eine große Menge von Daten in einer .csv-Datei, die ich unter Verwendung readr laden kann. Das Problem ist, dass es fehlende Werte gibt, die ich dem Datenrahmen hinzufügen muss.Füllen Sie sequentielle Werte in einem Datenrahmen

Beispieldaten:

X1 X2 Value 
Coal 1  300 
Coal 3  100 
Coal 5  150 
NatG 2  175 
NatG 4  150 

Diese Datei korrekt geladen werden in wird. Ich möchte jedoch die Verarbeitung so hinzufügen, dass der letzte Datenrahmen einen Eintrag für jeden X1-Typ und die gesamte Sequenz 1: 5 in X2 enthält, wobei die fehlenden Werte gleich Null sind. Der letzte Datenrahmen möchte wie folgt aus:

X1 X2 Value 
Coal 1  300 
Coal 2  0 
Coal 3  100 
Coal 4  0 
Coal 5  150 
NatG 1  0 
NatG 2  175 
NatG 3  0 
NatG 4  150 
NatG 5  0 

ich versucht, mit readr in einer Datei zu laden, die alle Einträge gleich Null hatte und dann in den realen Daten auf den gleichen Datenrahmen gelesen, aber es war eine destruktive Überschreibungs und die fehlenden Zeilen wurden entfernt. Ich muss wissen, wie man dem Datenrahmen entsprechende Zeilen hinzufügt, ohne zu wissen, welche Werte in der 1: 5-Folge für jeden Wert unter X1 fehlen.

+0

doriengart; Für zukünftige Bearbeitungen, zum Hinzufügen der Beispieldaten und zum Code in den Code-Blöcken (in grau) können Sie jede Zeile durch vier Leerzeichen unterscheiden oder den gewünschten Code markieren und auf das Icon '{}' klicken. – user20650

+0

vielleicht nützlich: https://stackoverflow.com/questions/10438969/fastest-way-to-add-rows-for-missing-values-in-a-data-frame; https://stackoverflow.com/questions/41007851/expanding-long-format-time-series-data-with-missing-rows; und gegebenen www's Antworten https://stackoverflow.com/questions/39961798/how-to-complete-missing-factor-levels-in-data-frame; https://stackoverflow.com/questions/32874239/how-doi-i-use-tidyr-to-fill-in-completed-rows-within-each-value-of-a-grouping-var – user20650

Antwort

4

Wir können die complete Funktion aus dem Paket verwenden. Die Funktion complete erstellt eine Kombination basierend auf den bereitgestellten Spalten. Das Argument fill kann die Füllwerte angeben.

library(tidyr) 

dt2 <- dt %>% 
    complete(X1, X2, fill = list(Value = 0)) 
dt2 
# # A tibble: 10 x 3 
#  X1 X2 Value 
# <chr> <int> <dbl> 
# 1 Coal  1 300 
# 2 Coal  2  0 
# 3 Coal  3 100 
# 4 Coal  4  0 
# 5 Coal  5 150 
# 6 NatG  1  0 
# 7 NatG  2 175 
# 8 NatG  3  0 
# 9 NatG  4 150 
# 10 NatG  5  0 

Wir können auch die Gruppenwerte für die Kombination angeben, wenn einige Gruppenwerte fehlen. Zum Beispiel können wir Folgendes tun, um sicherzustellen, dass 1 bis 5 in Spalte X2 alles berücksichtigt wurde.

dt2 <- dt %>% 
    complete(X1, X2 = 1:5, fill = list(Value = 0)) 

Nutzen full_seq, die automatisch die Sequenz auf der minimalen und maximalen Werte in einer Spalte wird basierend erstellen.

dt2 <- dt %>% 
    complete(X1, X2 = full_seq(X2, period = 1), fill = list(Value = 0)) 

DATA

dt <- read.table(text = "X1 X2 Value 
Coal 1  300 
       Coal 3  100 
       Coal 5  150 
       NatG 2  175 
       NatG 4  150", 
       header = TRUE, stringsAsFactors = FALSE) 
2

Große Lösung von @www mit tidyr. Dies ist ein Weg, dies in der Basis R zu tun.

levels <- 1:5 

type <- c("Coal", "NatG") 

df2 <- expand.grid(levels,type) 

df3 <- merge(dt, df2, by.x=c("X1","X2"), by.y=c("Var2","Var1"),all.y=T) 

df3[is.na(df3)] <- 0 

    X1 X2 Value 
1 Coal 1 300 
2 Coal 2  0 
3 Coal 3 100 
4 Coal 4  0 
5 Coal 5 150 
6 NatG 1  0 
7 NatG 2 175 
8 NatG 3  0 
9 NatG 4 150 
10 NatG 5  0 
+0

Got diese zur Arbeit , aber mit einer kleinen Zugabe. Das Einlesen der Daten aus einer CSV-Datei mit [readr] führte dazu, dass die ursprüngliche Eingabe ein Datenrahmen war. Ich musste es zuerst in eine data.table ändern, indem ich [setDT] aus dem Paket [data.table] verwendete. Danach funktionieren beide Lösungen. – doriengard

+0

Nichts hier sollte "data.table" benötigen. Möglicherweise müssen Sie 'dt'' as.data.frame' einstellen, aber das war's. Ich habe gerade "dt" als den Namen für deinen primären Tisch durchgemacht, weil du das benutzt hast. – Mako212

Verwandte Themen