Sto cercando di capire perché la funzione rbind
non funziona come previsto quando si uniscono data.frames senza nomi. Ecco il mio test:rbind data.frames senza nomi
test <- data.frame(
id=rep(c("a","b"),each=3),
time=rep(1:3,2),
black=1:6,
white=1:6,
stringsAsFactors=FALSE
)
# take some subsets with different names
pt1 <- test[,c(1,2,3)]
pt2 <- test[,c(1,2,4)]
# method 1 - rename to same names - works
names(pt2) <- names(pt1)
rbind(pt1,pt2)
# method 2 - works - even with duplicate names
names(pt1) <- letters[c(1,1,1)]
names(pt2) <- letters[c(1,1,1)]
rbind(pt1,pt2)
# method 3 - works - with a vector of NA's as names
names(pt1) <- rep(NA,ncol(pt1))
names(pt2) <- rep(NA,ncol(pt2))
rbind(pt1,pt2)
# method 4 - but... does not work without names at all?
pt1 <- unname(pt1)
pt2 <- unname(pt2)
rbind(pt1,pt2)
Questo sembra un po 'strano per me. Mi manca una buona ragione per cui questo non dovrebbe funzionare fuori dalla scatola?
modifica per ulteriori informazioni
Utilizzando @ suggerimento di JoshO'Brien a debug
, posso identificare l'errore come si verifica durante questa parte if
dichiarazione della funzione rbind.data.frame
if (is.null(pi) || is.na(jj <- pi[[j]]))
(versione on line del codice: http://svn.r-project.org/R/trunk/src/library/base/R/dataframe.R a partire da: "### Ecco i metodi per rbind e cbind.")
Dall'esecuzione del programma, il valore di pi
non sembra essere stato impostato a questo punto, quindi il programma tenta di indicizzare la costante incorporata pi
come pi[[3]]
e gli errori.
Da quello che posso capire, il pi
oggetto interno non sembra essere impostato a causa di questa linea precedente in cui clabs
è stato inizializzato come NULL
:
if (is.null(clabs)) clabs <- names(xi) else { #pi gets set here
Sono in un groviglio cercando di capire questo fuori, ma si aggiornerà quando si unirà.
Dai un'occhiata al codice di 'rbind.data.frame' ** più ** di cui è interessato il controllo e la corrispondenza dei nomi di colonne e righe. Si potrebbe fare 'debug (rbind.data.frame)' e quindi passare attraverso il metodo 4 per determinare esattamente dove viene generato l'errore. –
@ JoshO'Brien - sono stati aggiornati per fornire ulteriori informazioni. Non sono così bravo a interpretare il codice e ci sto lavorando, ma forse sarà ovvio per qualcun altro. – thelatemail