2011-08-26 12 views
5

Digamos que quiero generar un marco de datos grande desde cero.Creación de marcos de datos grandes

Utilizando la función data.frame es como generalmente crearía marcos de datos. Sin embargo, los df son extremadamente propensos a errores e ineficientes.

Entonces, existe una forma más eficiente de crear el siguiente marco de datos.

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

Yikes, ese es un código "malo". ¿Cómo puedo generar este marco de datos 'grande' de una manera más eficiente?

+0

soy una especie de c ¿Por qué tiene tantos datos repetidos en ambas columnas? Por lo general, cuando tengo datos repetidos en una columna, es variado o ciclo en la otra (creo que contar en binario). – Owen

Respuesta

7

Si su única fuente de información que es un pedazo de papel, entonces es probable que no conseguirá mucho mejor que eso, pero al menos puede consolidar todo lo que en un solo rep llamada para cada columna:

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

que debería ser la misma:

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

Pero si esta información ya está en una estructura de datos en I de alguna manera y sólo tiene que transformar , eso podría ser aún más fácil, pero necesitaríamos saber cuál es esa estructura.

+0

maldita sea ... vencerme de nuevo ... – John

+0

@John Lo siento. He perdido la cuenta de la cantidad de respuestas que he descartado porque alguien me golpeó, si eso te hace sentir mejor. – joran

+0

no ... podría enviarme un millón de dólares ... eso ayudaría – John

3

manualmente, (1) crear esta trama de datos:

> 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 

y (2) este vector de longitudes:

> 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 estas dos entradas (dfu y lens) podemos reconstruir df (aquí se llama df2):

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