【问题标题】:how to extract number beside specific string in a cell?如何提取单元格中特定字符串旁边的数字?
【发布时间】:2019-07-13 07:26:08
【问题描述】:

我想提取位于特定字符串旁边的单元格中的数字信息。我的数据如下所示。

    item             stock
PRE 24GUSSETX4SX15G   200
PLS 12KLRX10SX15G     200
ADU 24SBX200ML        200
NIS 18BNDX40SX11G     200
REF 500GX12BTL        200

我想提取除字符串'GUSSET'、'KLR'、'SB'、'BND'和'BTL'之外的数字。我想用这个数字与股票做乘法。比如这样。

            item         stock    pcs    total
    PRE 24GUSSETX4SX15G   200      24    4800
    PLS 12KLRX10SX15G     200      12    2400 
    ADU 24SBX200ML        200      24    4800
    NIS 18BNDX40SX11G     200      18    3600
    REF 500GX12BTL        200      12    2400

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

【问题讨论】:

    标签: r text-extraction


    【解决方案1】:

    使用基数 R 的一种方法是使用sub 提取除这些组之外的数字,并将它们与stock 相乘得到total

    df$pcs <- as.numeric(sub(".*?(\\d+)(GUSSET|KLR|SB|BND|BTL).*", "\\1", df$item))
    df$total <- df$stock * df$pcs
    
    df
    #               item stock pcs total
    #PRE 24GUSSETX4SX15G   200  24  4800
    #PLS   12KLRX10SX15G   200  12  2400
    #ADU      24SBX200ML   200  24  4800
    #NIS   18BNDX40SX11G   200  18  3600
    #REF      500GX12BTL   200  12  2400
    

    或者所有东西都在一个管道中

    library(dplyr)
    df %>%
      mutate(pcs = as.numeric(sub(".*?(\\d+)(GUSSET|KLR|SB|BND|BTL).*", "\\1", item)), 
             total = stock * pcs)
    

    【讨论】:

    • 如果我这样做有什么区别?"mutate(pcs = as.numeric(x = str_sub(string = str_extract(string = produk,pattern = "\\d+[GUSSET|KLR|SB| BND|BTL]"),start = 1,end = -2))"
    • @NicodemusSigitSutanto 我认为这是一种不同的策略。我不确定它的作用。
    • 我找到了答案。感谢您的启发
    【解决方案2】:

    我们可以在tidyverse这样做

    library(tidyverse)
    df %>%
        mutate(pcs = as.numeric(str_extract(item, "(\\d+)(?=(GUSSET|KLR|SB|BND|BTL))")),
        total = pcs * stock)
    #                 item stock pcs total
    #1 PRE 24GUSSETX4SX15G   200  24  4800
    #2   PLS 12KLRX10SX15G   200  12  2400
    #3      ADU 24SBX200ML   200  24  4800
    #4   NIS 18BNDX40SX11G   200  18  3600
    #5      REF 500GX12BTL   200  12  2400
    

    数据

    df <- structure(list(item = c("PRE 24GUSSETX4SX15G", "PLS 12KLRX10SX15G", 
    "ADU 24SBX200ML", "NIS 18BNDX40SX11G", "REF 500GX12BTL"), stock = c(200L, 
    200L, 200L, 200L, 200L)), class = "data.frame", row.names = c(NA, 
    -5L))
    

    【讨论】:

      猜你喜欢
      • 2012-02-14
      • 2018-06-04
      • 1970-01-01
      • 2023-02-25
      • 2011-08-04
      • 1970-01-01
      • 2019-10-19
      • 2017-12-21
      • 1970-01-01
      相关资源
      最近更新 更多