2015-10-28 2 views
1

Как можно считать столбец единиц и нулей непосредственно как logical, тем самым избегая последующих преобразований?read.csv столбец нулей и единиц как логический

В большой CSV файл, несколько столбцов имеют значения нуля или единицы, которые я хотел бы использовать в качестве логических переменных в R.

Если я указываю те colClasses логичным, то read.csv жалуется ожидаемый " логический», получил '0':

Error in scan(file, what, nmax, sep, 
dec, quote, skip, nlines, na.strings, : 
scan() expected 'a logical', got '0' 

с другой стороны, read.csv успешна, если я указываю эти colClasses как целое. Впоследствии, я могу преобразовать их, используя as.logical().

+0

Я предполагаю, что вы можете сделать это только/прочитать их напрямую, если значения «TRUE» и «FALSE» (или 'T' и' F'). Почему вы хотите/должны это сделать? Для эффективности или ясности, или ...? –

+0

Я, конечно, согласен, что вы не должны указывать исходный файл. Я до сих пор не знаю, что не так с чтением, а затем с переводом. На вашем месте я бы написал небольшую функцию обертки, чтобы читать, а затем конвертировать. –

ответ

3

tl; dr нет, невозможно насколько насколько я знаю.

Я не знаю, почему вы несчастны после преобразования, но вы можете написать обертку: если предположить, что вы никогда не хотите читать в колонке, содержащей T/F/TRUE/FALSE значения:

read.csv2 <- function(file,colClasses,...) { 
    lcols <- which(colClasses=="logical") 
    colClasses[lcols] <- "integer" 
    x <- read.csv(file,colClasses=colClasses,...) 
    x[lcols] <- lapply(x[lcols],as.logical) 
    x 
} 

(непроверенные!)

в противном случае, я бы подать запрос функции для readr или data.table::fread или ...

насколько я знаю, и пока кто-то не представляет доказательства противного, ответ на исходный вопрос

Как столбец из нулей и единиц можно прочитать непосредственно в качестве логического [используя только базовые функции R, такие как read.table], что позволяет избежать последующие преобразования?

«Это невозможно?»; не необоснованно, но не представляется возможным. Вы можете подать запрос на функцию http://bugs.r-project.org, или обсудить это дальше [email protected] ...

+0

Иногда я использую опции, иногда пост-конвертировать. Создатели R не думали обо всем. –

1

Если это обычное явление можно создать as -метод для класса, а затем дать это имя класса в качестве значения символа в colClasses. (В read.* функций будут пытаться применять любую как-методу к значениям читаются в пределах столбца. См ?read.table. Как описано там, как-метод должен преобразовать «символ» значение нужного типа.)

setClass("zero.one", contains=logical()) 
setAs("character", "zero.one", function(from){ 
          as.logical(as.numeric(from))}) 


input <- read.csv("fil.nam", colClasses = c(..., "zero.one" ...)) 

txt <- "1,2,3\n0,0,1\nf,0,8\n" 
read.csv(text=txt, colClasses="zero.one") 
    X1 X2 X3 
1 FALSE FALSE TRUE 
2 NA FALSE TRUE 
Смежные вопросы