2012-04-27 11 views
8

Ho difficoltà ad aggiungerne uno in fondo a un altro frame di dati.Aggiunta di un dataframe alla fine di un altro data.frame in R

Ho un frame di dati (chiamiamolo DF1) che ha 1 riga e 5 colonne. Ho un altro dataframe (chiamiamolo DF2) che ha 50 righe e 5 colonne. L'ho impostato in modo tale che le colonne tra i frame di dati BOTH corrispondano - hanno le stesse colonne. Infatti, DF1 è un calcolo basato su DF2.

Questo è ciò che DF1 assomiglia:

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

Questo è ciò DF2 assomiglia:

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 si suppone che sia il numero di punti di dati effettivi (# di valori che è non mancante) diviso per il numero totale di valori possibili.

così .. Voglio aggiungere DF1 al fondo del DF2 per assomigliare a questo:

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 

Quando ho provato ad utilizzare

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

DF1 è la prima riga in DF2. Ho bisogno che sia l'ultima riga.

Quando ho provato ad utilizzare

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

ottengo un errore:

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 

Ho provato unione, ho provato ad aggiungere una nuova riga alla DF2 e poi subbing nei valori di DF2..nulla sembra funzionare! Ho un disperato bisogno di aiuto! Chiunque?

+0

La risposta breve è che si può non (o almeno non dovreste 't). Le colonne dei frame di dati devono essere tutti vettori atomici (cioè lo stesso tipo di dati) e si sta tentando di combinare valori numerici (DF1) e caratteri/fattori (DF2). – joran

+0

"funzionerà" se le colonne di DF2 sono caratteri anziché fattori. Ma probabilmente dovresti trovare un modo diverso per collegare questi set di dati. – joran

risposta

6

Ecco cosa si dovrebbe fare:

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

Sono d'accordo con i commenti, questa è probabilmente una cattiva idea, ma ecco come si potrebbe fare.

Prima di tutto, con data.frame basato su elenco non si combinerà troppo bene in questo modo. Se si desidera recuperare i dati, sarà meglio convertirli in una matrice. Tieni presente che dovrai scegliere un singolo tipo per ogni riga del tuo frame di dati, quindi non puoi mantenere i tuoi numeri come numeri se sono associati a caratteri. Se siete disposti a trattare tutto come un personaggio, dare a questo un andare:

> 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" 
Problemi correlati