代码之家  ›  专栏  ›  技术社区  ›  Indrajeet Patil

使用“readr”函数“parse\u number”正确提取数字[重复]

  •  0
  • Indrajeet Patil  · 技术社区  · 6 年前

    假设你有一根绳子:

    strLine <- "The transactions (on your account) were as follows: 0 3,000 (500) 0 2.25 (1,200)"
    

    result <- c(0, 3000, -500, 0, 2.25, -1200)?
    

    result[3] = -500
    

    注意,数字以会计形式显示,因此负数出现在()之间。同样,你可以假设只有数字出现在数字第一次出现的右边。我对regexp不是很在行,所以如果您需要帮助,我会非常感激的。另外,我不想假设字符串总是相同的,所以我希望去掉第一个数字位置之前的所有单词(和任何特殊字符)。

    0 回复  |  直到 12 年前
        1
  •  35
  •   Ari B. Friedman    12 年前
    library(stringr)
    x <- str_extract_all(strLine,"\\(?[0-9,.]+\\)?")[[1]]
    > x
    [1] "0"       "3,000"   "(500)"   "0"       "2.25"    "(1,200)"
    

    将parens改为否定:

    x <- gsub("\\((.+)\\)","-\\1",x)
    x
    [1] "0"      "3,000"  "-500"   "0"      "2.25"   "-1,200"
    

    as.numeric() taRifx::destring next version 属于 destring 默认情况下支持负片,因此 keep 不需要选项):

    library(taRifx)
    destring( x, keep="0-9.-")
    [1]    0 3000  -500    0    2.25 -1200
    

    或:

    as.numeric(gsub(",","",x))
    [1]     0  3000  -500     0     2.25 -1200
    
        2
  •  20
  •   Matthew Plourde    12 年前

    这是基本的R方法,为了完整性。。。

    x <- unlist(regmatches(strLine, gregexpr('\\(?[0-9,.]+', strLine)))
    x <- as.numeric(gsub('\\(', '-', gsub(',', '', x)))
    [1]     0.00  3000.00  -500.00     0.00     2.25 -1200.00
    
        3
  •  1
  •   RRuiz    7 年前

    当我在一个 data frame (同一列中每行一个字符串)如下:

    library(taRifx)
    DataFrame$Numbers<-as.character(destring(DataFrame$Strings, keep="0-9.-"))
    

    结果在同一列的新列中 数据帧

        4
  •  1
  •   hrbrmstr    6 年前

    既然这是另一个问题 stringi 解决方案(与 stringr

    as.numeric(
      stringi::stri_replace_first_fixed(
        stringi::stri_replace_all_regex(
          unlist(stringi::stri_match_all_regex(
            "The transactions (on your account) were as follows: 0 3,000 (500) 0 2.25 (1,200)", 
            "\\(?[0-9,.]+\\)?"
          )), "\\)$|,", ""
        ),
        "(", "-"
      )
    )