604 Stimmen

Erstellen Sie einen leeren data.frame

Ich versuche, einen data.frame ohne Zeilen zu initialisieren. Im Grunde möchte ich die Datentypen für jede Spalte angeben und sie benennen, aber keine Zeilen als Ergebnis erstellen lassen.

Das Beste, was ich bisher machen konnte, ist so etwas wie:

df <- data.frame(Date=as.Date("01/01/2000", format="%m/%d/%Y"), 
                 File="", User="", stringsAsFactors=FALSE)
df <- df[-1,]

Dadurch wird ein data.frame mit einer einzigen Zeile erstellt, die alle gewünschten Datentypen und Spaltennamen enthält, aber es wird auch eine nutzlose Zeile erstellt, die dann entfernt werden muss.

Gibt es eine bessere Möglichkeit, dies zu tun?

30voto

Thomas Punkte 41827

Der effizienteste Weg, dies zu tun, ist die Verwendung von structure um eine Liste zu erstellen, die die Klasse "data.frame" :

structure(list(Date = as.Date(character()), File = character(), User = character()), 
          class = "data.frame")
# [1] Date File User
# <0 rows> (or 0-length row.names)

Um dies im Vergleich zu der gegenwärtig akzeptierten Antwort in die richtige Perspektive zu rücken, hier ein einfacher Vergleichswert:

s <- function() structure(list(Date = as.Date(character()), 
                               File = character(), 
                               User = character()), 
                          class = "data.frame")
d <- function() data.frame(Date = as.Date(character()),
                           File = character(), 
                           User = character(), 
                           stringsAsFactors = FALSE) 
library("microbenchmark")
microbenchmark(s(), d())
# Unit: microseconds
#  expr     min       lq     mean   median      uq      max neval
#   s()  58.503  66.5860  90.7682  82.1735 101.803  469.560   100
#   d() 370.644 382.5755 523.3397 420.1025 604.654 1565.711   100

17voto

marc Punkte 335

Wenn Sie auf der Suche nach Kürze sind:

read.csv(text="col1,col2")

so dass Sie die Spaltennamen nicht separat angeben müssen. Sie erhalten den Standardspaltentyp logisch, bis Sie den Datenrahmen füllen.

15voto

Shrikant Prabhu Punkte 659

Ich habe mit folgendem Code einen leeren Datenrahmen erstellt

df = data.frame(id = numeric(0), jobs = numeric(0));

und versucht, einige Zeilen zu binden, um diese wie folgt zu füllen.

newrow = c(3, 4)
df <- rbind(df, newrow)

aber es begann, falsche Spaltennamen wie folgt anzuzeigen

  X3 X4
1  3  4

Die Lösung für dieses Problem besteht darin, newrow wie folgt in den Typ df zu konvertieren

newrow = data.frame(id=3, jobs=4)
df <- rbind(df, newrow)

ergibt nun einen korrekten Datenrahmen, wenn die Spaltennamen wie folgt angezeigt werden

  id nobs
1  3   4

9voto

Cybernetic Punkte 10978

An einen leeren Datenrahmen erstellen geben Sie die Anzahl der benötigten Zeilen und Spalten in die folgende Funktion ein:

create_empty_table <- function(num_rows, num_cols) {
    frame <- data.frame(matrix(NA, nrow = num_rows, ncol = num_cols))
    return(frame)
}

So erstellen Sie einen leeren Rahmen wobei die Klasse jeder Spalte angegeben wird übergeben Sie einfach einen Vektor der gewünschten Datentypen an die folgende Funktion:

create_empty_table <- function(num_rows, num_cols, type_vec) {
  frame <- data.frame(matrix(NA, nrow = num_rows, ncol = num_cols))
  for(i in 1:ncol(frame)) {
    print(type_vec[i])
    if(type_vec[i] == 'numeric') {frame[,i] <- as.numeric(frame[,i])}
    if(type_vec[i] == 'character') {frame[,i] <- as.character(frame[,i])}
    if(type_vec[i] == 'logical') {frame[,i] <- as.logical(frame[,i])}
    if(type_vec[i] == 'factor') {frame[,i] <- as.factor(frame[,i])}
  }
  return(frame)
}

Verwenden Sie wie folgt:

df <- create_empty_table(3, 3, c('character','logical','numeric'))

Das ergibt:

   X1  X2 X3
1 <NA> NA NA
2 <NA> NA NA
3 <NA> NA NA

Um Ihre Auswahl zu bestätigen, führen Sie den folgenden Befehl aus:

lapply(df, class)

#output
$X1
[1] "character"

$X2
[1] "logical"

$X3
[1] "numeric"

7voto

Ali Khosro Punkte 1320

Wenn Sie einen leeren data.frame mit dynamischen Namen (colnames in einer Variablen) erstellen möchten, kann dies helfen:

names <- c("v","u","w")
df <- data.frame()
for (k in names) df[[k]]<-as.numeric()

Sie können die Typen auch ändern, wenn Sie dies wünschen:

names <- c("u", "v")
df <- data.frame()
df[[names[1]]] <- as.numeric()
df[[names[2]]] <- as.character()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X