2016-07-27 8 views
0

Ich hoffe, alles ist gut. Ich schreibe in Bezug auf eine sehr spezifische Frage in R, zu der ich bisher keine Lösung online finden konnte. Wenn die Frage bereits an anderer Stelle beantwortet wurde, tut es mir leid, dass ich Sie belästigt habe, aber ich wäre Ihnen dankbar, wenn Sie mir den Link zur Verfügung stellen könnten.R: Wie erstellt man einen Datenrahmen mit einer Beobachtung für jede Kombination von Faktoren

Ich habe 3 separate Datensätze:

Die erste ist eine Liste von Unternehmen. Der zweite ist eine Liste von Jahren. Der dritte ist eine Liste von Ländern.

Mein Ziel ist jetzt, diese 3 Datensätze in einen neuen Datenrahmen zusammenzuführen. Der letzte Datenrahmen sollte eine Datenzeile für jede Kombination dieser 3 Variablen erstellen. Aus diesem Grund kann ich die Funktion merge() nicht verwenden. Als nächsten Schritt möchte ich Daten entlang dieses neu erstellten Datenrahmens abgleichen.

Vielen Dank für Ihre Unterstützung - und nochmals Entschuldigung, wenn die Frage bereits an anderer Stelle angesprochen wurde!

Antwort

0

Versuchen merge:

A <- data.frame(Companies = LETTERS[1:3]) 
B <- data.frame(Years = 2000:2002) 
C <- data.frame(Countries = c("GER", "UK", "US")) 

X <- merge(merge(A, B), C) 
X 

    Companies Years Countries 
1   A 2000  GER 
2   B 2000  GER 
3   C 2000  GER 
4   A 2001  GER 
5   B 2001  GER 
6   C 2001  GER 
7   A 2002  GER 
8   B 2002  GER 
9   C 2002  GER 
10   A 2000  UK 
... 

Wenn Sie mehr als drei Variablen/Faktoren haben Sie könnten Ihre eigenen Merge-Funktion wie folgt schreiben:

mergeN <- function(dfs = NULL) { 
    if(is.null(dfs) | class(dfs) != "list") stop("'dfs' is not a list!") 
    if(length(dfs) > 1) { 
    dfs[[1]] <- merge(dfs[[1]], dfs[[2]]) 
    dfs[[2]] <- NULL 
    Recall(dfs) 
    } else { 
    return(dfs[[1]]) 
    } 
} 

D <- data.frame(Products = letters[24:26]) 
E <- data.frame(Divisions = c(100,200,300)) 

mergeN(list(A, B, C, D, E)) 

Dies wird Ihnen ein Datenrahmen von allen 3^5 = 243 Kombinationen.

-Update aufgrund Kommentare:

A <- data.frame(Companies = LETTERS[1:3]) 
B <- data.frame(Years = 2000:2002) 
C <- data.frame(Countries = c("GER", "UK", "US")) 

X <- merge(merge(A, B), C) 

Y <- data.frame(Companies = LETTERS[1:3], Years = rep(2000,3), Countries = c("GER", "UK", "US"), Revenues = c(20433,23255,32164)) 

merge(X, Y, all=T) 

    Companies Years Countries Revenues 
1   A 2000  GER 20433 
2   A 2000  UK  NA 
3   A 2000  US  NA 
4   A 2001  GER  NA 
5   A 2001  UK  NA 
6   A 2001  US  NA 
7   A 2002  GER  NA 
8   A 2002  UK  NA 
9   A 2002  US  NA 
10   B 2000  GER  NA 
11   B 2000  UK 23255 
12   B 2000  US  NA 
13   B 2001  GER  NA 
14   B 2001  UK  NA 
15   B 2001  US  NA 
16   B 2002  GER  NA 
17   B 2002  UK  NA 
18   B 2002  US  NA 
19   C 2000  GER  NA 
20   C 2000  UK  NA 
21   C 2000  US 32164 
22   C 2001  GER  NA 
23   C 2001  UK  NA 
24   C 2001  US  NA 
25   C 2002  GER  NA 
26   C 2002  UK  NA 
27   C 2002  US  NA 

(Wenn Sie das wollen NA Null ist: Z[is.na(Z)] <- 0)

+0

Hallo Martin, vielen Dank, das war genau das, was ich gesucht habe. Allerdings stehe ich immer noch vor einem Problem: Ich habe diesen neuen Datenrahmen nun mit allen möglichen Kombinationen von Faktoren eingerichtet. Ich möchte jetzt Daten mit diesem Datenrahmen abgleichen. Ich habe einen vierten Datensatz mit Attributen für einige dieser Kombinationen, aber nicht alle. Wenn ich merge (DatenframeA, DatenframeB, by = c ("X", "Y")), ich am Ende mit einem neuen Datenrahmen, die Zeilen nicht durch diese Zusammenführung Operation unberücksichtigt enthält. Ich würde jedoch gerne solche Zeilen mit "0" -Werten enthalten. Gibt es einen Weg? Martin – deca

+0

Klingt, als ob Sie die Argumente 'all',' all.x' und 'all.y' überprüfen sollten? –

+0

@Martin Ich erweiterte die Antwort –

0

Borrowing Eingangsdatenrahmen von @ Martin, hier ist ein Ansatz, der Ihre Daten in den sie beinhaltet in Rahmen einer list und mit dann Reduce():

d1 <- data.frame(Companies = LETTERS[1:3]) 
d2 <- data.frame(Years = 2000:2002) 
d3 <- data.frame(Countries = c("GER", "UK", "US")) 
d4 <- data.frame(Companies = LETTERS[1:3], Years = rep(2000,3), Countries = c("GER", "UK", "US"), Revenues = c(20433,23255,32164)) 

d <- list(d1, d2, d3, d4) 
merged_dat <- Reduce(function(...) merge(..., all=T), d) 
head(merged_dat) 
#> Companies Years Countries Revenues 
#> 1   A 2000  GER 20433 
#> 2   A 2000  UK  NA 
#> 3   A 2000  US  NA 
#> 4   A 2001  GER  NA 
#> 5   A 2001  UK  NA 
#> 6   A 2001  US  NA 

ich ziehe t sein, weil es auf so viele Datenrahmen verallgemeinert wie Sie haben könnten.