2015-02-20 3 views
2

я заметил, что при чтении большого файла CSV с помощьюread.table автоматических имена столбцов

output <- read.table(..., header = TRUE, sep = ",") 

кадра данных, который был создан имело некоторые пустые столбцы. Эти колонны следовали шаблон именования

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" 

Я заметил, что в ?read.table говорится

col.names: вектора дополнительных имен для переменных. По умолчанию должен использовать «V», за которым следует номер столбца.

Почему он использует X для меня вместо V?

Edit: Это то, что файл 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,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 

...

+0

Вы можете использовать 'fread', если вы используете большой файл CSV. Покажите свои данные. – Metrics

+0

@richard нет. Я не получал никаких предупреждений. Этот фрейм данных является динамическим, но иногда программное обеспечение, которое выплевывает эти данные для меня, добавляет эти дополнительные запятые. – aeongrail

+0

@Metrics, я не думал, что для решения этой проблемы необходимы данные образца, но я все равно добавил первые несколько строк. :) – aeongrail

ответ

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") 
} 

Это if (missing(col.names)) col.names <- first, что очень важно. Оттуда, мы можем вернуться назад и получить first, определенный для этой ситуации

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

, что приводит к

# [1] "Date"  "Duration" "Count" "Factor 1" "Factor 2" "Factor 3" "Hour"  "Day"  "Month" 
# [10] "Year"  ""   ""   ""   ""   ""   ""   ""   ""   
# [19] ""   ""   ""   ""   ""   ""   ""   ""   ""   
# [28] ""   ""   ""   ""   ""   ""   ""   ""   ""   
# [37] ""   ""   ""   ""   ""   ""   ""   ""   

Тогда позже, 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"  

Причина, по которой мы получили X, а не V, как указано в документах, заключается в следующем: состояние после if(header) является

else if (missing(col.names)) 
    col.names <- paste0("V", 1L:cols) 

Но мы никогда не делали это на это заявление, и 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,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," 
+0

Ах, ха! так что это функция make.names, которая помещает в нее X! Спасибо друг! То, что интересно, так это то, что документация говорит нам, что это «V», тогда ... – aeongrail

+0

И 'make.names (" ")' дает «X» - спасибо Ричарду, это тоже меня исказило! –

+0

Это произошло потому, что 'else if (missing (col.names)) col.names <- paste0 (" V ", 1L: cols)' приходит после инструкции 'if (header)', поэтому мы никогда не попадали в это утверждение –

Смежные вопросы