read.table自动列名

aeo*_*ail 2 r dataframe

我注意到在读取大型csv文件时

output <- read.table( ..., header = TRUE, sep = ",")
Run Code Online (Sandbox Code Playgroud)

创建的数据框有一些空白列.这些列遵循命名模式

 colnames(output)
     "Factor.1"   "Factor.2"   "etc"        "Stuff"      "X"          "X.1"        "X.2"        "X.3"        "X.4"        "X.5"       
     "X.6"        "X.7"        "X.8"        "X.9"        "X.10"       "X.11"       "X.12"       "X.13"      
     "X.14"       "X.15"       "X.16"       "X.17"       "X.18"       "X.19"       "X.20"       "X.21"      
     "X.22"       "X.23"       "X.24"       "X.25"       "X.26"       "X.27"       "X.28"       "X.29"      
     "X.30"       "X.31"       "X.32"       "X.33"
Run Code Online (Sandbox Code Playgroud)

我注意到?read.table它的状态

col.names: 变量的可选名称向量.默认设置是使用" V "后跟列号.

为什么我用X而不是V?

编辑:这是csv文件的样子

Date,Duration,Count,Factor 1,Factor 2,Factor 3,Hour,Day,Month,Year,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1/1/2012 0:00,9.99,10,GC,LS,FT,0,7,1,2012,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1/1/2012 1:00,9.63125,8,GC,LS,FT,1,7,1,2012,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1/1/2012 2:00,7.388888889,3,GC,LS,FT,2,7,1,2012,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1/1/2012 3:00,7.087037037,9,GC,LS,FT,3,7,1,2012,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Run Code Online (Sandbox Code Playgroud)

...

Ric*_*ven 5

这是相关的代码片段 read.table()

if (header) {
    .External(C_readtablehead, file, 1L, comment.char, 
              blank.lines.skip, quote, sep, skipNul)
    if (missing(col.names)) 
        col.names <- first
    else if (length(first) != length(col.names)) 
        warning("header and 'col.names' are of different lengths")
}
Run Code Online (Sandbox Code Playgroud)

if (missing(col.names)) col.names <- first很重要.从那里开始,我们可以回过头来获取first,定义为这种情况

first <- scan(textConnection(file), what = "", sep = ",", 
    nlines = 1, quiet = TRUE, skip = 0, strip.white = TRUE)
Run Code Online (Sandbox Code Playgroud)

结果

#  [1] "Date"     "Duration" "Count"    "Factor 1" "Factor 2" "Factor 3" "Hour"     "Day"      "Month"   
# [10] "Year"     ""         ""         ""         ""         ""         ""         ""         ""        
# [19] ""         ""         ""         ""         ""         ""         ""         ""         ""        
# [28] ""         ""         ""         ""         ""         ""         ""         ""         ""        
# [37] ""         ""         ""         ""         ""         ""         ""         ""        
Run Code Online (Sandbox Code Playgroud)

然后再make.names()打电话col.names,产生你的名字

make.names(first, unique = TRUE)
#  [1] "Date"     "Duration" "Count"    "Factor.1" "Factor.2" "Factor.3" "Hour"     "Day"      "Month"   
# [10] "Year"     "X"        "X.1"      "X.2"      "X.3"      "X.4"      "X.5"      "X.6"      "X.7"     
# [19] "X.8"      "X.9"      "X.10"     "X.11"     "X.12"     "X.13"     "X.14"     "X.15"     "X.16"    
# [28] "X.17"     "X.18"     "X.19"     "X.20"     "X.21"     "X.22"     "X.23"     "X.24"     "X.25"    
# [37] "X.26"     "X.27"     "X.28"     "X.29"     "X.30"     "X.31"     "X.32"     "X.33"    
Run Code Online (Sandbox Code Playgroud)

我们之所以得到X而不是V文档中提到的原因是因为下一个条件if(header)

else if (missing(col.names)) 
    col.names <- paste0("V", 1L:cols) 
Run Code Online (Sandbox Code Playgroud)

但我们从来没有这样做过,默认情况下make.names()连接到X了.除了这个解释之外,还有更多内容.最好的办法是通过read.table源(它很复杂).

数据:

file <- "Date,Duration,Count,Factor 1,Factor 2,Factor 3,Hour,Day,Month,Year,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1/1/2012 0:00,9.99,10,GC,LS,FT,0,7,1,2012,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1/1/2012 1:00,9.63125,8,GC,LS,FT,1,7,1,2012,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1/1/2012 2:00,7.388888889,3,GC,LS,FT,2,7,1,2012,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1/1/2012 3:00,7.087037037,9,GC,LS,FT,3,7,1,2012,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"
Run Code Online (Sandbox Code Playgroud)