【问题标题】:R:how to extract the first integer or decimal number from a text, and if the first number equal to specific numbers extract the second integer/decimalR:如何从文本中提取第一个整数或小数,如果第一个数字等于特定数字,则提取第二个整数/小数
【发布时间】:2022-02-02 19:55:11
【问题描述】:

数据是这样的:

示例 - 数据库名称

detail - 第一列包含带有数字的字符串(数字可以附加到 $ 等,例如 25m$,也可以是十进制,例如 1.2m$ 或 $1.2M)

假设数据表如下所示:

  example$detail<- c("The cole mine market worth every year 100M$ and the equipment they use worth 30$m per capita", "In 2017 the first enterpenur realized there is a potential of 500$M in cole mining", "The cole can make 23b$ per year ans help 1000000 familys living on it")

我想在示例数据表中添加一列 - 名为:“number”,它将提取“detail”列中字符串中的第一个数字。但是如果这个数字等于向量“year”中的一个数字(它不在示例数据库中 - 它是我创建的一个单独的列表),我希望它提取字符串 example$detail 的第二个数字。

所以我创建了另一个年份列表(与数据库分开),

     years<-c(2016:2030 )

我正在尝试创建新列 - 编号

到目前为止我做了什么: 通过编写以下命令,我设法添加了提取字符串第一个数字的变量:

    example$number<-as.integer( sub("\\D*(\\d+).*", "\\1", example$detail) ) # EXTRACT ONLT INTEGERS

    example$number1<-format(round(as.numeric(str_extract(example$detail, "\\d+\\.*\\d*")), 2), nsmall = 2) #EXTRACT THE NUMBERS AS DECIMALS WITH TWO DIGITS AFTER THE . (ITS ENOUGH FOR ME)

    example$number1<-ifelse(example$number %in% years, TRUE, example$number1 ) #IF THE FIRST NUMBER EXTRACTED ARE IN THE YEARS VECTOR RETURN "TRUE"

然后我尝试编写一个代码,根据这个提取第二个数字,如果它不起作用,只是返回错误

我试过了:

   gsub("[^\d]*[\d]+[^\d]+([\d]+)", example$detail)

   str_extract(example$detail, "\d+(?=[A-Z\s.]+$)",[[2]])

   as.integer( sub("\\D*(\\d+).*", "\\1", example$detail) )

   as.numeric(strsplit(example$detail, "\\D+")[1])

我不明白我如何符号化任何数字(整数\数字)或如何符号化字符串中的第二个数字。

非常感谢!!

【问题讨论】:

  • 请用缩进格式化代码
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: r integer decimal data-extraction


【解决方案1】:
  1. 列表项

由于没有提供好的示例数据,我将在此处“使用”。

假设数据框df 有年份 (int) 和详细信息 (char) 列,那么

 df = mutate(clean_details = sub("[^0-9.-]", "",details),
             clean_details_part1 = as.integer(strsplit(clean_details,"[.]")[[1]][1]),
             clean_details_part2 = as.integer(strsplit(clean_details,"[.]")[[1]][2])
      )

这适用于我编写的代码。我没有应用逻辑,因为我看到你足够熟练做到这一点。我相信一个简单的 ifelse 语句可以创建一个布尔值,然后您可以过滤该布尔值,或者最直接的方式。

【讨论】:

  • 感谢您的回答!我试图将它应用到我的数据上,但它返回错误,我想这是我的错,因为没有编写正确的数据示例,所以我在下面编辑了它,非常感谢
  • 而且我真的很熟悉所有符号...我试图从正则表达式手册 (stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html) 中理解所有含义,但这还不够...。如果您有建议在哪里阅读更多关于它,它真的很有帮助!再次感谢
  • 您提供的数据非常复杂。如果货币金额没有货币符号怎么办(如果人们使用百万或十亿的首字母缩写词(m、mm、mil、mill、b、bn 等),我的脚本会中断?如果有人用百万表示十亿怎么办(这会破坏你的检查删除年份,例如,有人可能会说 20.2 亿美元)?这是您正在寻找的一个非常细微的要求。我认为您需要先更好地清理数据,我建议查看用于清理数据的 NLP 包(text2vec、tidytext 、stringr 等)您正在寻找清理数据的人,而我不想这样做。
  • 我可以处理 5% 的不准确率,我知道数据非常复杂,但我在“规则”中所做的假设已经足够好......(没有办法清理数据,因为它需要人为清洁,并且有数千行......并且沿途会有越来越多的行)我试图弄清楚的是从字符串中提取第二个小数或整数的脚本(如果第一个会下降“意外”,因为它是 2020M$ 生病了)我试图弄清楚的事情。再次感谢您的 cmets :)
猜你喜欢
  • 2019-07-12
  • 2017-02-13
  • 2020-12-30
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多