【问题标题】:How to extract numbers from mixed strings [duplicate]如何从混合字符串中提取数字[重复]
【发布时间】:2021-12-19 21:18:40
【问题描述】:

我有一个字符串字符向量,可以是整数,也可以是“Pn[ab]?”形式的字符串

> figc
 [1] "3"   "2"   "7"   "8"   "10"  "3"   "4"   "6"   "P3a" "P3b" "5"   "P9" 
[13] "1"   "13"  "15"  "18"  "21"  "22"  "5"   "6"   "9"   "1"   "13"  "14" 
[25] "15" 

我想将这些转换为数字,其中“P3a”的结果是 3,而“P9”的结果是 9。

我试过了:

fig <- ifelse(substr(figc, 1, 1)=="P",
              as.numeric(substr(figc, 2, 1)),
              as.numeric(figc))

给予:

> fig <- ifelse(substr(figc, 1, 1)=="P",
+               as.numeric(substr(figc, 2, 1)),
+               as.numeric(figc))
Warning message:
In ifelse(substr(figc, 1, 1) == "P", as.numeric(substr(figc, 2,  :
  NAs introduced by coercion
> 
> fig
 [1]  3  2  7  8 10  3  4  6 NA NA  5 NA  1 13 15 18 21 22  5  6  9  1 13 14 15

但我得到非数字的 NA。如何解决这个问题?我查看了stringr 包,但看不到任何有助于解决这个简单问题的东西

【问题讨论】:

    标签: r string type-conversion


    【解决方案1】:

    我们可以使用parse_number

    library(readr)
    parse_number(figc)
     [1]  3  2  7  8 10  3  4  6  3  3  5  9  1 13 15 18 21 22  5  6  9  1 13 14 15
    

    数据

    figc <- c("3", "2", "7", "8", "10", "3", "4", "6", "P3a", "P3b", "5", 
    "P9", "1", "13", "15", "18", "21", "22", "5", "6", "9", "1", 
    "13", "14", "15")
    

    【讨论】:

      【解决方案2】:

      使用str extract和字符类\\d

      library(stringr)
      str_extract(string, "\\d+")
      [1] "3" "2" "6" "3" "3" "5" "9"
      

      或者,在base R 中,您可以使用否定字符类\\D,它匹配任何不是数字的字符,并将其删除:

      gsub("\\D", "", string)
      

      数据:

      string <- c("3","2", "6", "P3a", "P3b", "5", "P9")
      

      【讨论】:

      • 需要as.numeric,例如as.numeric(str_extract(figc, "\\d+"))
      【解决方案3】:

      我们可以使用gsub 删除所有字母:

      as.numeric(gsub("[[:alpha:]]", "", figc))
      
      [1]  3  2  7  8 10  3  4  6  3  3  5  9  1 13 15 18 21 22  5  6  9  1 13 14 15
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-24
        • 1970-01-01
        • 1970-01-01
        • 2018-12-14
        • 2017-04-20
        • 1970-01-01
        • 2017-02-17
        • 1970-01-01
        相关资源
        最近更新 更多