如何从单元格中提取一些数据?

时间:2019-07-12 07:15:48

标签: r extract

我想提取单元格中的数字信息。我的数据看起来像这样。

      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

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

2 个答案:

答案 0 :(得分:2)

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-07-12创建

希望这会有所帮助。

答案 1 :(得分:1)

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

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
  • 括号创建两个正则表达式组,第一个是前缀,第二个是我们要匹配的实际数字。
  • 我们可以在第二组之前用反斜杠代替第二组;仅在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))