3

如何将一列 1 和 0 直接读入 as logical,从而避免后续转换?

在大型 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().

4

2 回答 2

4

tl;博士不,据我所知不可能。

我不知道您为什么在转换后不满意,但您可以编写一个包装器:假设您实际上不想读取包含///值T的列FTRUEFALSE

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
}

(未经测试!)

否则,我会提交功能请求readror data.table::freador ...

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

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

“这不可能吗?”;不是不合理,但不可能。您可以在http://bugs.r-project.org提交功能请求,或者在r-devel@r-project.org...上进一步讨论。

于 2015-10-28T23:04:53.370 回答
4

如果这是经常发生的情况,您可以as为一个类创建一个 -method,然后将该类名称作为字符值提供给 colClasses 参数。(这些read.*函数将尝试将任何 as-methods 应用于在列中读取的值。请参阅?read.table。如那里所述,as-method 必须将“字符”值转换为所需的类型。)

 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
于 2016-11-27T19:02:35.583 回答