2017-10-07 4 views
0

Gegeben zu berücksichtigen:Manipulieren von Daten-Set für wiederholte Messungen

df <- data.frame(
        CompanyID=c("Drinkers","Drinkers","Drinkers","Drinkers","Drinkers","Drinkers","Drinkers","Drinkers" 
          ,"Drinkers","Drinkers", "Liquders","Liquders","Liquders","PelletCoffeeCo","PelletCoffeeCo"), 
        Email= c("[email protected]", "[email protected]","[email protected]","[email protected]", "[email protected]", 
          "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", 
          "[email protected]","[email protected]","[email protected]","[email protected]", 
         "[email protected]"), 
        Day= c("1","2","3","4","5","6","7","8","9","10","1","2","3","1","2"), 
       var1= c(4,5,5,5,2,3,2,7,6,5,7,6,6,2,3)) 

ich brauche, um herauszufinden, wie man zu:

df2 <- data.frame(CompanyID=c("Drinkers","Drinkers","Drinkers","Drinkers","Drinkers","Drinkers","Drinkers","Drinkers" 
          ,"Drinkers","Drinkers", "Liquders","Liquders","Liquders","Liquders","Liquders","Liquders", 
          "Liquders","Liquders","Liquders","Liquders", "PelletCoffeeCo","PelletCoffeeCo","PelletCoffeeCo", 
          "PelletCoffeeCo","PelletCoffeeCo","PelletCoffeeCo","PelletCoffeeCo","PelletCoffeeCo", 
          "PelletCoffeeCo","PelletCoffeeCo"), 
        Email= c("[email protected]", "[email protected]","[email protected]","[email protected]", "[email protected]", 
          "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", 
          "[email protected]","[email protected]","[email protected]","[email protected]","[email protected]", 
          "[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]", 
          "[email protected]","[email protected]","[email protected]","[email protected]", 
          "[email protected]","[email protected]","[email protected]","[email protected]", 
          "[email protected]"), 
        Day= c("1","2","3","4","5","6","7","8","9","10","1","2","3","4","5","6","7","8","9","10", 
         "1","2","3","4","5","6","7","8","9","10"), 
        var1= c(4,5,5,5,2,3,2,7,6,5,7,6,6, NA,NA,NA,NA,NA,NA,NA, 2,3,NA,NA,NA,NA,NA,NA,NA,NA)) 

Erläuterung: Ich habe Daten, wo ich Menschen einmal täglich befragt über ein Kurs von 10 Tagen. In einer perfekten Welt würde ich 10 Antworten von jedem Teilnehmer bekommen, bezeichnet mit Tag1: Tag10. Aufgrund der fehlenden Antwort gaben jedoch einige Teilnehmer 3 Antworten, andere 6 und andere 10 und so weiter. Ich setze die Daten auf ein Wachstumsmodell, und deshalb brauche ich die Spalte "Tag", um immer Tag 1 zu lesen - Tag 10, unabhängig davon, ob Daten für diese Antworten vorliegen. Ich habe versucht, dies zu demonstrieren, indem ich NAs zu Zeilen hinzufüge, die nicht alle 10 Tage Daten haben.

Wie würde ich über diese gehen?

Vielen Dank im Voraus!

Antwort

2

Versuchen Sie folgendes:

library(tidyr) 

df %>% 
    complete(nesting(CompanyID,Email), Day = seq(min(Day), max(Day), 1L)) %>% 
    data.frame() 

Ausgang:

 CompanyID     Email Day var1 
1  Drinkers  [email protected] 1 4 
2  Drinkers  [email protected] 2 5 
3  Drinkers  [email protected] 3 5 
4  Drinkers  [email protected] 4 5 
5  Drinkers  [email protected] 5 5 
6  Drinkers  [email protected] 6 2 
7  Drinkers  [email protected] 7 3 
8  Drinkers  [email protected] 8 2 
9  Drinkers  [email protected] 9 7 
10  Drinkers  [email protected] 10 6 
11  Liquders  [email protected] 1 7 
12  Liquders  [email protected] 2 NA 
13  Liquders  [email protected] 3 6 
14  Liquders  [email protected] 4 6 
15  Liquders  [email protected] 5 NA 
16  Liquders  [email protected] 6 NA 
17  Liquders  [email protected] 7 NA 
18  Liquders  [email protected] 8 NA 
19  Liquders  [email protected] 9 NA 
20  Liquders  [email protected] 10 NA 
21 PelletCoffeeCo [email protected] 1 2 
22 PelletCoffeeCo [email protected] 2 NA 
23 PelletCoffeeCo [email protected] 3 3 
24 PelletCoffeeCo [email protected] 4 NA 
25 PelletCoffeeCo [email protected] 5 NA 
26 PelletCoffeeCo [email protected] 6 NA 
27 PelletCoffeeCo [email protected] 7 NA 
28 PelletCoffeeCo [email protected] 8 NA 
29 PelletCoffeeCo [email protected] 9 NA 
30 PelletCoffeeCo [email protected] 10 NA 

Edit:

Der Code über jeder Spalte Werte Tag der Gruppe füllt sich mit einem kompletten Satz von Tageswerte definiert durch das Minimum und Maximum der vorhandenen Werte in th in der Spalte (d.h. 1 und 10). Die Gruppen, nach denen diese Tageswerte gefüllt werden, können nach Bedarf neu definiert werden, aber ich entschied mich, sie hier als Firma + E-Mail mit der Zeile "Verschachtelung (FirmenID, E-Mail)" zu definieren. Die Zeile data.frame() dient nur dazu, die Ausgabe in ein data.frame anstatt in ein tibble umzuwandeln. Wenn eine data.frame-Ausgabe nicht erforderlich ist, können Sie diese Zeile ersetzen oder entfernen.

+0

Super! Vielen Dank. Es hat wie ein Zauber funktioniert. Ich habe eine Reihe von anderen Variablen, x1: x10, ich hoffe, es wird das gleiche funktionieren. Können Sie die Funktionen erklären? Ich sehe, wie es funktioniert, aber nicht sicher, wie vollständig und Verschachtelung zusammen funktioniert - und warum dann die Notwendigkeit, das Argument data.frame am Ende hinzufügen? – D500

+0

@ D500 - Kein Problem. Siehe die oben hinzugefügte Erklärung. – www

0

Erstellen Sie zuerst einen Datenrahmen der eindeutigen Firmen-ID. Erstellen Sie als Nächstes einen Datenrahmen der gewünschten Tage.

Kreuz Verbinden Sie diese zusammen.

Dann verbinden Sie sich mit Ihrem ursprünglichen Datensatz, um die Tabelle auszufüllen.

comp <- data.frame(CompanyID = unique(df$CompanyID)) 
Day <- data.frame(Day = c("1","2","3","4","5","6","7","8","9","10")) 

compDay <- merge(comp, Day, all = TRUE) 

dfday <- merge(df, compDay, by = c("CompanyID", "Day"), all = TRUE) 
+0

Super! Vielen Dank. Es hat wie ein Zauber funktioniert. – D500

Verwandte Themen