【问题标题】:how to extract some data from cells?如何从单元格中提取一些数据?
【发布时间】:2019-07-12 07:15:48
【问题描述】:

我想提取单元格中的数字信息。我的数据如下所示。

      item       stock
PRE 24DX4SX15G    200      
PLS 12RX10SX15G   200
ADU 24PX200ML     200
NIS 18PX40SX11G   200
REF 500GX12D      200

我想提取除字母 D、R 和 P 之外的数字。我想用这个数字与股票做乘法运算。比如这样。

          item       stock    pcs    total
    PRE 24DX4SX15G    200      24    4800
    PLS 12RX10SX15G   200      12    2400 
    ADU 24PX200ML     200      24    4800
    NIS 18PX40SX11G   200      18    3600
    REF 500GX12D      200      12    2400

有人知道如何提取数字吗?非常感谢提前

【问题讨论】:

  • 如何分开做?因为数字位置并不总是位于“空格”之后

标签: r extract


【解决方案1】:
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(stringr)

dataset <- read.table(text = '      item       stock
PRE 24DX4SX15G    200      
PLS 12RX10SX15G   200
ADU 24PX200ML     200
NIS 18PX40SX11G   200
REF 500GX12D      200',
                      header = TRUE)

dataset %>%
  mutate(pcs = as.numeric(x = str_sub(string = str_extract(string = item,
                                                           pattern = "\\d+[DRP]"),
                                      start = 1,
                                      end = -2)),
         total = (stock * pcs))
#>          item stock pcs total
#> 1  24DX4SX15G   200  24  4800
#> 2 12RX10SX15G   200  12  2400
#> 3   24PX200ML   200  24  4800
#> 4 18PX40SX11G   200  18  3600
#> 5    500GX12D   200  12  2400

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

希望这会有所帮助。

【讨论】:

  • 我想问。开始和结束的数字是什么意思?我的意思是“start=1”和“end=-2”)
  • @NicodemusSigitSutanto str_sub 从提供的字符串中选择一个子字符串。我们需要指定这样一个子字符串的开始和结束。 start 表示将在所选子字符串中的第一个字符的位置,end 表示最后一个字符的位置。这里,1 表示从提供的字符串的最开头开始,-2 表示倒数第二个字符。
【解决方案2】:

我会使用合适的正则表达式:

df$pcs <- gsub("^(.*[^0-9]|)([0-9]+)[DPR].*", "\\2", df$item)
df$pcs <- as.numeric(df$pcs)

解释:

  • [DPR] 表示我们正在匹配一个字符,即 D、P 或 R
  • [^0-9] 表示我们匹配任何数字 0-9 之一
  • 括号创建两个正则表达式组,第一个是前缀,第二个是我们要匹配的实际数字。
  • 我们可以使用第二组来代替,在 2 前面加上一个反斜杠;只是为了在 R 中得到一个反斜杠,我们需要输入两个反斜杠:\\2
  • 可以在不同的位置找到感兴趣的编号(在 D、P 或 R 之前)。要么在开头,在这种情况下我们应该匹配^([0-9]+)[DPR],要么在文本中的某个地方。因此,我们必须首先匹配字符串的开头 (^),然后选择不匹配任何内容或不以数字结尾的任何内容 (.*[^0-9])。

编辑:使用 stringr 库(如 @yamabrina 在另一个答案中所示),正则表达式要简单得多:

library(stringr)
df$pcs <- as.numeric(str_sub(str_extract(df$item, "[0-9]+[DPR]"), 1, -2))

【讨论】:

  • 如果我想提取前面有字符“SB”和“KLR”的数字呢?这个怎么加?
  • 我不明白。 “SB”不是字符而是字符串。请更具体。你的意思是说“先是 S 或 B,然后是 K、L 或 R”,还是“先是 SB,然后是 KLR”?
  • 我的意思是字符串。对不起
  • 要提取一个以“SB”或“KLR”开头的数字,您只需使用(SB|KLR)([0-9]+)(x|y) 构造表示“模式 x 或模式 y”(您可以添加更多模式,例如 (x|y|z)
猜你喜欢
  • 2011-09-07
  • 2016-10-31
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
相关资源
最近更新 更多