r用法 - r選取資料




創建一個空的data.frame (9)

我試圖初始化data.frame沒有任何行。 基本上,我想為每列指定數據類型並命名它們,但是沒有創建任何行作為結果。

到目前為止,我所能做到的最好的事情是:

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

它創建一個data.frame,其中一行包含我想要的所有數據類型和列名稱,但也會創建一個無用的行,然後需要將其刪除。

有一個更好的方法嗎?


你可以使用read.table和一個空字符串作為輸入text ,如下所示:

colClasses = c("Date", "character", "character")
col.names = c("Date", "File", "User")

df <- read.table(text = "",
                 colClasses = colClasses,
                 col.names = col.names)

或者將col.names指定為字符串:

df <- read.csv(text="Date,File,User", colClasses = colClasses)

感謝Richard Scriven的改進


假設你的列名是動態的,你可以創建一個空的行名矩陣並將其轉換為數據框。

nms <- sample(LETTERS,sample(1:10))
as.data.frame(t(matrix(nrow=length(nms),ncol=0,dimnames=list(nms))))

只需用空向量初始化它即可:

df <- data.frame(Date=as.Date(character()),
                 File=character(), 
                 User=character(), 
                 stringsAsFactors=FALSE) 

以下是使用不同列類型的其他示例:

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 

注意:

使用錯誤類型的空列初始化data.frame並不會阻止進一步添加具有不同類型列的行。
從某種意義上說,從一開始就有正確的列類型,因此,如果代碼依賴於某些列類型檢查,則該方法會更安全一些,即使數據data.frame行數為零也可以工作。


執行此操作的最有效方法是使用structure來創建具有類"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)

與目前公認的答案相比,這是一個簡單的基準:

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

如果你不介意不明確指定數據類型,你可以這樣做:

headers<-c("Date","File","User")
df <- as.data.frame(matrix(,ncol=3,nrow=0))
names(df)<-headers

#then bind incoming data frame with col types to set data types
df<-rbind(df, new_df)

如果你想用動態名稱(變量中的變項名)創建一個空的data.frame,這可以幫助:

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

如果您需要,您也可以更改類型。 喜歡:

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

如果你正在尋找簡短:

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

所以你不需要單獨指定列名。 在填充數據框之前,您將獲得默認的列類型邏輯。


您可以在不指定列類型的情況下進行

df = data.frame(matrix(vector(), 0, 3,
                dimnames=list(c(), c("Date", "File", "User"))),
                stringsAsFactors=F)

創建一個空的數據框 ,請將所需的行數和列數傳遞到以下函數中:

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

在指定每列的類時創建一個空框架,只需將所需數據類型的矢量傳遞給以下函數:

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(df[,i])}
    if(type_vec[i] == 'character') {frame[,i] <- as.character(df[,i])}
    if(type_vec[i] == 'logical') {frame[,i] <- as.logical(df[,i])}
    if(type_vec[i] == 'factor') {frame[,i] <- as.factor(df[,i])}
  }
  return(frame)
}

使用方法如下:

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

這使:

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

要確認您的選擇,請運行以下命令:

lapply(df, class)

#output
$X1
[1] "character"

$X2
[1] "logical"

$X3
[1] "numeric"




dataframe