2014-10-31 20 views
9

Ho cercato estensivamente ma non ho trovato una risposta a questa domanda su Stack Overflow.Aggiungi colonne a un frame di dati vuoto in R

Diciamo che ho un frame di dati a.

mi definiscono:

a <- NULL 
a <- as.data.frame(a) 

Se volessi aggiungere una colonna a questo frame di dati come così:

a$col1 <- c(1,2,3) 

ottengo il seguente errore:

Error in `$<-.data.frame`(`*tmp*`, "a", value = c(1, 2, 3)) : 
    replacement has 3 rows, data has 0 

Perché la dimensione della riga è stata riparata ma la colonna non lo è?

Come modificare il numero di righe in un frame di dati?

Se faccio questo (inserendo i dati in una lista e poi la conversione in un df), funziona benissimo:

a <- NULL 
a$col1 <- c(1,2,3) 
a <- as.data.frame(a) 

risposta

7

La dimensione di riga non è fisso, ma data.frames sono memorizzati come lista di vettori che sono vincolati ad avere la stessa lunghezza. Non è possibile aggiungere col1 a a perché col1 ha tre valori (righe) e a ha zero, interrompendo quindi il vincolo. R non utilizza automaticamente i valori di vivivizzazione quando si tenta di estendere la dimensione di un data.frame aggiungendo una colonna più lunga di data.frame. Il motivo per cui il secondo esempio funziona è che col1 è l'unico vettore nel data.frame in modo che data.frame sia inizializzato con tre righe.

Se si desidera avere automaticamente il data.frame espandersi, è possibile utilizzare la seguente funzione:

cbind.all <- function (...) 
{ 
    nm <- list(...) 
    nm <- lapply(nm, as.matrix) 
    n <- max(sapply(nm, nrow)) 
    do.call(cbind, lapply(nm, function(x) rbind(x, matrix(, n - 
     nrow(x), ncol(x))))) 
} 

Questo riempirà i valori mancanti con NA. E lo useresti come: cbind.all(df, a)

+0

Credo che questo vicino a quello che ho fatto già. Pensavo ci fosse una soluzione più intelligente di questa. Mi rendo conto che stavo usando un vettore invece di aggiungerlo a un dataframe. Inoltre, probabilmente non ho descritto cosa volevo dire quando ho usato la parola fixed. La dimensione della riga non può essere modificata facilmente come la dimensione della colonna. – Michal

+0

Inoltre, è la stessa risposta: http://stackoverflow.com/questions/7962267/cbind-a-df-with-an-empty-df-cbind-fill – Michal

1

Si potrebbe anche fare qualcosa di simile in cui leggo dati da più file, prendo la colonna che voglio e la memorizzo nel dataframe. Ho verificare se il dataframe ha qualcosa in esso, e se non lo fa, crearne uno nuovo piuttosto che ottenere l'errore circa il numero di righe non corrispondenti:

readCounts = data.frame() 

for(f in names(files)){ 
    d = read.table(files[f], header=T, as.is=T) 
    d2 = round(data.frame(d$NumReads)) 
    colnames(d2) = f 
    if(ncol(readCounts) == 0){ 
     readCounts = d2 
     rownames(readCounts) = d$Name 
    } else{ 
     readCounts = cbind(readCounts, d2) 
    } 
} 
Problemi correlati