read.csv列为0和1为逻辑列

时间:2015-10-28 22:13:23

标签: r csv read.csv

如何将一列0和0直接作为logical读取,从而避免后续转换?

在一个大型csv文件中,有几列的值为零或一,我希望将其用作R中的逻辑变量。

如果我将这些colClasses指定为逻辑,那么read.csv会抱怨预期'逻辑&#39 ;,得到' 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()转换它们。

2 个答案:

答案 0 :(得分:3)

tl; dr 不,据我所知,这是不可能的。

我不知道为什么你在转换后不满意,但是你可以编写一个包装器:假设你实际上不想读取包含T / F / {的列{1}} / 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或...

提交功能请求

据我所知,直到有人提出相反的证据,才能回答原来的问题

  

如何将一列0和1作为逻辑直接读入[仅使用data.table::fread等基本R函数,从而避免后续转换?

“这不可能吗?”;不无道理,但不可能。您可以在http://bugs.r-project.org提交功能请求,或在read.table ...

上进一步讨论

答案 1 :(得分:2)

如果这是常规事件,您可以为类创建as - 方法,然后将该类名作为字符值提供给colClasses参数。 (read.*函数将尝试将任何as方法应用于列中读取的值。请参阅?read.table。如上所述,as-method必须转换&#34;字符&#34 ;值为所需类型。)

 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