2012-04-27 49 views
8

Tengo dificultades para agregar uno al final de otro marco de datos.Agregando un dataframe al final de otro data.frame en R

Tengo un marco de datos (llamémoslo DF1) que tiene 1 fila y 5 columnas. Tengo otro marco de datos (vamos a llamarlo DF2) que tiene 50 filas y 5 columnas. Lo configuré de forma tal que las columnas entre AMBOS marcos de datos coinciden, tienen las mismas columnas. De hecho, DF1 es un cálculo basado en DF2.

Esto es lo DF1 se parece a:

row.names  pt1  pt2  pt3  pt4 
    calc   0.93 0.45 0.28 0.54 

Esto es lo que se ve DF2 como:

row.names  pt1  pt2  pt3  pt4 
    SNP1   AA  AG  AG  AA  
    SNP2   CT  CT  TC  CC 
    SNP3   GG  CG  CG  <NA> 
    SNP4   AA  GG  AG  AA 
    SNP5   <NA> <NA> <NA> <NA> 

DF1 se supone que es el número de puntos de datos reales (# de valores que es no falta) dividido por el número total de valores posibles.

SO .. Quiero añadir DF1 a la parte inferior de DF2 a tener este aspecto:

row.names  pt1  pt2  pt3  pt4 
    SNP1   AA  AG  AG  AA  
    SNP2   CT  CT  TC  CC 
    SNP3   GG  CG  CG  <NA> 
    SNP4   AA  GG  AG  AA 
    SNP5   <NA> <NA> <NA> <NA> 
    calc   0.93 0.45 0.28 0.54 

Cuando he intentado usar

both.dfs <- rbind(DF1, DF2) # DF1 is first here 

DF1 es la primera fila de DF2. NECESITO que sea la ÚLTIMA fila.

cuando intenté usar

both.dfs <- rbind(DF2, DF1) # DF2 is first here 

consigo un error:

Warning messages: 
1: In `[<-.factor`(`*tmp*`, iseq, value = 0.84) : 
    invalid factor level, NAs generated 
2: In `[<-.factor`(`*tmp*`, iseq, value = 0.84) : 
    invalid factor level, NAs generated 
3: In `[<-.factor`(`*tmp*`, iseq, value = 0.84) : 
    invalid factor level, NAs generated 
4: In `[<-.factor`(`*tmp*`, iseq, value = 0.74) : 
    invalid factor level, NAs generated 

He tratado de combinación, he intentado añadir una nueva fila a la DF2 y luego sustituía en los valores de DF2 ... ¡nada parece funcionar! ¡Necesito desesperadamente ayuda! ¿Nadie?

+0

La respuesta corta es que no puede (o al menos no deberías 't). Las columnas de marcos de datos deben ser vectores atómicos (es decir, el mismo tipo de datos), y está intentando mezclar numéricos (DF1) y caracteres/factores (DF2). – joran

+0

Funcionará si las columnas de DF2 son caracteres en lugar de factores. Pero aún debes encontrar una forma diferente de vincular estos conjuntos de datos. – joran

Respuesta

6

Esto es lo que debe hacer:

DFtranspose <- cbind(t(DF1[2, ]), t(DF2)) 
rownames(DFtranspose) <- DF1[1, ] 
3

Estoy de acuerdo con los comentarios, que esta es probablemente una mala idea, pero así es cómo podría hacerlo.

En primer lugar, con el data.frame basado en listas no se combinará demasiado bien de esta manera. Si desea recopilar los datos, será mejor que los convierta en una matriz. Tenga en cuenta que tendrá que elegir un solo tipo para cada fila de su marco de datos, por lo que no puede mantener sus números como números si están vinculados a caracteres. Si usted está dispuesto a tratar todo como un personaje, pruébalo:

> df1 <- data.frame(pt1="a", pt2="b", row.names=1) 
> rownames(df1) <- "e" 
> df2 <- data.frame(letters[1:4], pt1=1:4, pt2=2:5, row.names=1) 
> rbind(as.matrix(df2), as.matrix(df1)) 
    pt1 pt2 
a "1" "2" 
b "2" "3" 
c "3" "4" 
d "4" "5" 
e "a" "b" 
Cuestiones relacionadas