【问题标题】:How to get empty last elements from strsplit() in R?如何从 R 中的 strsplit() 中获取空的最后一个元素?
【发布时间】:2014-11-01 22:35:48
【问题描述】:

我需要处理一些主要是 csv 的数据。问题是如果逗号出现在行尾,R 会忽略逗号(例如,下例中 3 之后的那个)。

> strsplit("1,2,3,", ",")
[[1]]
[1] "1" "2" "3"

我希望它改为[1] "1" "2" "3" NA。我怎样才能做到这一点?谢谢。

【问题讨论】:

    标签: r string csv strsplit


    【解决方案1】:

    这里有几个想法

    scan(text="1,2,3,", sep=",", quiet=TRUE)
    #[1]  1  2  3 NA
    
    unlist(read.csv(text="1,2,3,", header=FALSE), use.names=FALSE)
    #[1]  1  2  3 NA
    

    它们都返回整数向量。您可以将as.character 包裹在其中任何一个周围,以获得您在问题中显示的确切输出:

    as.character(scan(text="1,2,3,", sep=",", quiet=TRUE))
    #[1] "1" "2" "3" NA 
    

    或者,您可以在scan 中指定what="character",或者在read.csv 中指定colClasses="character" 以获得略有不同的输出

    scan(text="1,2,3,", sep=",", quiet=TRUE, what="character")
    #[1] "1" "2" "3" "" 
    
    unlist(read.csv(text="1,2,3,", header=FALSE, colClasses="character"), use.names=FALSE)
    #[1] "1" "2" "3" "" 
    

    您还可以指定na.strings=""colClasses="character"

    unlist(read.csv(text="1,2,3,", header=FALSE, colClasses="character", na.strings=""), 
           use.names=FALSE)
    #[1] "1" "2" "3" NA 
    

    【讨论】:

      【解决方案2】:

      Hadley 的 stringi(以及之前的 stringr)库是对基本字符串函数(完全矢量化、一致的函数接口)的巨大改进:

      require(stringr)
      str_split("1,2,3,", ",")
      
      [1] "1" "2" "3" "" 
      
      as.integer(unlist(str_split("1,2,3,", ",")))
      [1]  1  2  3 NA
      

      【讨论】:

      • stringr 很慢,你应该使用stringi :)
      • @silvaran 你是完全正确的,我写这篇文章后才知道stringi。 (到底如何才能掌握 R 中的 which-latest-greatest-package?)
      【解决方案3】:

      使用stringi 包:

      require(stringi)
      > stri_split_fixed("1,2,3,",",")
      [[1]]
      [1] "1" "2" "3" "" 
      ## you can directly specify if you want to omit this empty elements
      > stri_split_fixed("1,2,3,",",",omit_empty = TRUE)
      [[1]]
      [1] "1" "2" "3"
      

      【讨论】:

        猜你喜欢
        • 2018-11-28
        • 1970-01-01
        • 2014-12-12
        • 2014-03-11
        • 2018-12-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        相关资源
        最近更新 更多