【问题标题】:read.csv column of zeros and ones as logicalread.csv 列的零和一为逻辑
【发布时间】:2016-01-28 21:40:55
【问题描述】:

如何将一列一和零直接读入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'

另一方面,如果我将colClasses 指定为整数,read.csv 会成功。之后,我可以使用as.logical() 转换它们。

【问题讨论】:

  • 我的猜测是,如果值为TRUEFALSE(或TF),您只能执行此操作/直接读取它们。你为什么想要/需要这样做?为了效率,或清晰,或...?
  • 我当然同意你不应该修改源文件。我仍然不知道阅读然后转换有什么问题。在你的位置,我会编写一个小包装函数来读取然后转换。

标签: r csv read.csv


【解决方案1】:

如果这是经常出现的情况,您可以为类创建as-方法,然后将该类名称作为字符值提供给 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

【讨论】:

    【解决方案2】:

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

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

    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
    }
    

    (未经测试!)

    否则,我会为 readrdata.table::fread 或 ... 提交功能请求。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      相关资源
      最近更新 更多