Sto cercando di inizializzare un data.frame senza alcuna riga. Fondamentalmente, voglio specificare i tipi di dati per ogni colonna e nominarli, ma non avere alcuna riga creata come risultato.
Il meglio che sono riuscito a fare finora è qualcosa come:
df <- data.frame(Date=as.Date("01/01/2000", format="%m/%d/%Y"),
File="", User="", stringsAsFactors=FALSE)
df <- df[-1,]
Che crea un data.frame con una singola riga contenente tutti i tipi di dati e i nomi delle colonne che volevo, ma crea anche una riga inutile che poi deve essere rimossa.
C'è un modo migliore per farlo?
Basta inizializzarlo con vettori vuoti:
df <- data.frame(Date=as.Date(character()),
File=character(),
User=character(),
stringsAsFactors=FALSE)
Ecco un altro esempio con diversi tipi di colonna:
df <- data.frame(Doubles=double(),
Ints=integer(),
Factors=factor(),
Logicals=logical(),
Characters=character(),
stringsAsFactors=FALSE)
str(df)
> str(df)
'data.frame': 0 obs. of 5 variables:
$ Doubles : num
$ Ints : int
$ Factors : Factor w/ 0 levels:
$ Logicals : logi
$ Characters: chr
N.B. :
L'inizializzazione di un data.frame
con una colonna vuota del tipo sbagliato non impedisce ulteriori aggiunte di righe con colonne di tipo diverso.
Questo metodo è solo un po' più sicuro nel senso che avrete i tipi di colonna corretti fin dall'inizio, quindi se il vostro codice si basa su qualche controllo del tipo di colonna, funzionerà anche con un data.frame
con zero righe.
Potreste usare read.table
con una stringa vuota per l'input text
come segue:
colClasses = c("Date", "character", "character")
col.names = c("Date", "File", "User")
df <- read.table(text = "",
colClasses = colClasses,
col.names = col.names)
In alternativa, specificando il col.names
come una stringa:
df <- read.csv(text="Date,File,User", colClasses = colClasses)
Grazie a Richard Scriven per il miglioramento