如何将一列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()
转换它们。
答案 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