【问题标题】:Cut a character vector into name, numbers and na values in R将字符向量切割成 R 中的名称、数字和 na 值
【发布时间】:2020-04-10 00:19:39
【问题描述】:

我有一个以名称开头的字符向量,后跟数字和不带分隔符的 NA 值。 NA 值的长度为 3 (na.),数字的长度可能不同,具体取决于它们是负数还是正数。例如。 -1.0 的长度为 4,0.7 的长度为 3。 输入:

mydata <- c("indigo-1.00.71.21.01.11.12.52.5na.na.1.21.01.01.0na.na.na.na.",
             "lago1.9-0.71.21.01.11.12.52.5na.na.1.21.01.01.0na.na.na.na.")
mydata 
[1] "indigo-1.00.71.21.01.11.12.52.5na.na.1.21.01.01.0na.na.na.na."
[2] "lago1.9-0.71.21.01.11.12.52.5na.na.1.21.01.01.0na.na.na.na."  

解决方案应该是一个如下所示的字符向量:

[1] "indigo" "-1.0" "0.7" "1.2" "1.0" "1.1" "1.1" "2.5" "2.5" "na." "na." "1.2" "1.0" "1.0" "1.0" "na." "na." "na." "na."
[2] "lago" "1.9" "-0.7" "1.2" "1.0" "1.1" "1.1" "2.5" "2.5" "na." "na." "1.2" "1.0" "1.0" "1.0" "na." "na." "na." "na."


【问题讨论】:

    标签: r regex vector


    【解决方案1】:

    使用base R,或许你可以试试下面的解决方案,使用regmatches(),即,

    regmatches(mydata,gregexpr("[[:alpha:]]+|-?\\d.\\d|na\\.",mydata))
    

    这样

    > regmatches(mydata,gregexpr("[[:alpha:]]+|-?\\d.\\d|na\\.",mydata))
    [[1]]
     [1] "indigo" "-1.0"   "0.7"    "1.2"    "1.0"    "1.1"    "1.1"    "2.5"    "2.5"    "na."    "na."    "1.2"    "1.0"   
    [14] "1.0"    "1.0"    "na."    "na."    "na."    "na."   
    
    [[2]]
     [1] "lago" "1.9"  "-0.7" "1.2"  "1.0"  "1.1"  "1.1"  "2.5"  "2.5"  "na."  "na."  "1.2"  "1.0"  "1.0"  "1.0"  "na."  "na." 
    [18] "na."  "na.
    
    

    【讨论】:

      【解决方案2】:

      使用stringr 和一些正则表达式很容易做到这一点:

      mydata <- c("indigo-1.00.71.21.01.11.12.52.5na.na.1.21.01.01.0na.na.na.na.",
                  "lago1.9-0.71.21.01.11.12.52.5na.na.1.21.01.01.0na.na.na.na.")
      
      library(stringr)
      str_extract_all(mydata, "^[[:alpha:]]+|-{0,1}\\d.\\d|na.")
      #> [[1]]
      #>  [1] "indigo" "-1.0"   "0.7"    "1.2"    "1.0"    "1.1"    "1.1"    "2.5"   
      #>  [9] "2.5"    "na."    "na."    "1.2"    "1.0"    "1.0"    "1.0"    "na."   
      #> [17] "na."    "na."    "na."   
      #> 
      #> [[2]]
      #>  [1] "lago" "1.9"  "-0.7" "1.2"  "1.0"  "1.1"  "1.1"  "2.5"  "2.5"  "na." 
      #> [11] "na."  "1.2"  "1.0"  "1.0"  "1.0"  "na."  "na."  "na."  "na."
      

      reprex package (v0.3.0) 于 2019 年 12 月 17 日创建

      请注意,结果是一个列表,其中的元素包含原始向量中每个元素的一个字符向量。你上面所说的确切形式在R中是不可能的

      【讨论】:

      • 谢谢,但是第一个列表中的第一个元素应该是indigo,第二个元素应该是-1.0。在第二个列表中,前三个元素是错误的。
      • 也许str_extract_all(mydata, "^[[:alpha:]]+|-*[0-9.]{3}|na.")
      猜你喜欢
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2019-07-09
      • 1970-01-01
      相关资源
      最近更新 更多