2011-08-26 6 views
5

Supposons que je souhaite générer une grande base de données à partir de zéro.Création de grandes trames de données

L'utilisation de la fonction data.frame est la façon dont je créerais généralement des trames de données. Cependant, df est comme ce qui suit sont extrêmement sujettes aux erreurs et inefficace.

Il existe donc une manière plus efficace de créer la trame de données suivante.

df <- data.frame(GOOGLE_CAMPAIGN=c(rep("Google - Medicare - US", 928), rep("MedicareBranded", 2983), 
            rep("Medigap", 805), rep("Medigap Branded", 1914), 
            rep("Medicare Typos", 1353), rep("Medigap Typos", 635), 
            rep("Phone - MedicareGeneral", 585), 
            rep("Phone - MedicareBranded", 2967), 
            rep("Phone-Medigap", 812), 
            rep("Auto Broad Match", 27), 
            rep("Auto Exact Match", 80), 
            rep("Auto Exact Match", 875)),     
       GOOGLE_AD_GROUP=c(rep("Medicare", 928), rep("MedicareBranded", 2983), 
            rep("Medigap", 805), rep("Medigap Branded", 1914), 
            rep("Medicare Typos", 1353), rep("Medigap Typos", 635), 
            rep("Phone ads 1-Medicare Terms",585), 
            rep("Ad Group #1", 2967), rep("Medigap-phone", 812), 
            rep("Auto Insurance", 27), 
            rep("Auto General", 80), 
            rep("Auto Brand", 875))) 

Aïe, qui est un code 'mauvais'. Comment puis-je générer cette «grande» base de données de manière plus efficace?

+0

Je suis une sorte de c Pourquoi avez-vous autant de données répétées dans les deux colonnes? Habituellement, lorsque j'ai répété des données dans une colonne, il est varié ou cyclé dans l'autre (pensez à compter en binaire). – Owen

Répondre

7

Si votre seule source pour cette information est un morceau de papier, alors vous n'obtiendrez probablement pas beaucoup mieux que cela, mais vous pouvez au moins consolider tout cela en un seul appel rep pour chaque colonne:

#I'm going to cheat and not type out all those strings by hand 
x <- unique(df[,1]) 
y <- unique(df[,2]) 

#Vectors of the number of times for each  
x1 <- c(928,2983,805,1914,1353,635,585,2967,812,27,955) 
y1 <- c(x1[-11],80,875) 

dd <- data.frame(GOOGLE_CAMPAIGN = rep(x, times = x1), 
       GOOGLE_AD_GROUP = rep(y, times = y1)) 

qui devrait être le même:

> all.equal(dd,df) 
[1] TRUE 

Mais si cette information est déjà dans une structure de données en R et en quelque sorte, vous avez juste besoin de transformer cela pourrait être encore plus facile, mais nous aurions besoin de savoir quelle est cette structure.

+0

putain .. me battre à nouveau ... – John

+0

@John Désolé. J'ai perdu le compte du nombre de réponses que j'ai jetées parce que quelqu'un m'a battu, si cela vous fait vous sentir mieux. – joran

+0

ce n'est pas ... vous pourriez m'envoyer un million de dollars ... cela aiderait – John

3

manuellement, (1) créer cette trame de données:

> dfu <- unique(df) 
> rownames(dfu) <- NULL 
> dfu 
      GOOGLE_CAMPAIGN   GOOGLE_AD_GROUP 
1 Google - Medicare - US     Medicare 
2   MedicareBranded   MedicareBranded 
3     Medigap     Medigap 
4   Medigap Branded   Medigap Branded 
5   Medicare Typos    Medicare Typos 
6   Medigap Typos    Medigap Typos 
7 Phone - MedicareGeneral Phone ads 1-Medicare Terms 
8 Phone - MedicareBranded    Ad Group #1 
9   Phone-Medigap    Medigap-phone 
10  Auto Broad Match    Auto Insurance 
11  Auto Exact Match    Auto General 
12  Auto Exact Match     Auto Brand 

et (2) ce vecteur de longueurs:

> lens <- rle(as.numeric(interaction(df[[1]], df[[2]])))$lengths 
> lens 
[1] 928 2983 805 1914 1353 635 585 2967 812 27 80 875 

A partir de ces deux entrées (dfu et lens), on peut reconstruire df (ici appelé df2):

> df2 <- dfu[rep(seq_along(lens), lens), ] 
> rownames(df2) <- NULL 
> identical(df, df2) 
[1] TRUE 
Questions connexes