2017-10-07 5 views
0

Vu:ensemble de données Manipuler pour tenir compte des mesures répétées

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)) 

je dois comprendre comment se rendre à:

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)) 

Explication: J'ai données où je a sondé les gens une fois par jour sur un cours de 10 jours. Dans un monde parfait, j'aurais 10 réponses de chaque participant, notées day1: day10. Cependant, en raison de la non-réponse, certains participants ont donné 3 réponses, d'autres 6, et 10 et ainsi de suite. Je mets les données en place pour lancer un modèle de croissance, et j'ai donc besoin de la colonne Jour pour toujours lire Jour1 - Jour 10, peu importe s'il y a des données pour ces réponses. J'ai essayé de le démontrer en ajoutant NA aux lignes qui n'ont pas tous les 10 jours de données.

Comment procéder?

Merci à l'avance!

Répondre

2

Essayez ceci:

library(tidyr) 

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

Sortie:

 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:

Le code remplit au-dessus des valeurs de la colonne du jour de chaque groupe avec un ensemble complet de valeurs du jour défini par le minimum et le maximum des valeurs existantes dans à la colonne (c.-à-d. 1 et 10, respectivement). Les groupes par lesquels ces valeurs Day sont remplies peuvent être redéfinis selon les besoins, mais j'ai choisi de les définir ici comme Company + Email avec la ligne "nesting (CompanyID, Email)". La ligne data.frame() est juste là pour convertir la sortie en un data.frame au lieu d'un tibble. Si une sortie data.frame n'est pas nécessaire, n'hésitez pas à remplacer ou supprimer cette ligne.

+0

Génial! Merci beaucoup. Ça a marché comme sur des roulettes. J'ai un certain nombre d'autres variables, x1: x10, j'espère que ça va fonctionner de la même manière. Pourriez-vous expliquer les fonctions? Je vois comment cela fonctionne, mais je ne sais pas comment fonctionne l'imbrication complète et l'imbrication - et alors pourquoi le besoin d'ajouter l'argument data.frame à la fin? – D500

+0

@ D500 - Pas de problème. Voir l'explication ajoutée ci-dessus. – www

0

D'abord, créez une trame de données de l'ID de société unique. Ensuite, créez une trame de données des jours souhaités.

Croix Rejoignez-les ensemble.

Alors rejoignez notre ensemble de données original pour remplir le tableau.

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

Génial! Merci beaucoup. Ça a marché comme sur des roulettes. – D500