【问题标题】:R/Power-Query: Replace value with matchingR/Power-Query:用匹配替换值
【发布时间】:2020-06-08 16:38:59
【问题描述】:

我正在尝试清理庞大数据集中的一些数据。 一列包含销售额的值。示例值可能如下所示:

清理数据:

Sales Potential

230

120

300

但是,在某些时候会出现这样的情况:

脏数据

0, 0, 0, 0, 0

4, 0, 0, 0

0, 0, 480

0, 200, 0

在脏数据的第一种情况下,单元格应该只包含一个零:0 在所有其他情况下,如果有任何非零数字,我想提取此数字并用此值替换单元格或添加新的清理列。

所以脏数据清理干净了:

清理数据:

0

4

480

200

我的方法是在 R 中使用 RegExpressions,因为我正在使用 Power-Query 将数据加载到 Power-BI。 我试图找到一种模式,在其中提取我正在寻找的值并将其放入新列中。但是,我的结果看起来什么都没有。 在R 中是否有更简单的方法来实现这一点?

到目前为止的代码: library(stringr) OutputRegEx <- data.frame(MyDataset) Splitter = function(x) substr(str_extract(x,'[1-9]'),1,7) OutputRegEx[["RegExAuswertung"]] <- apply(OutputRegEx[43],1, function(x) Splitter(x) )

【问题讨论】:

    标签: r regex powerbi substring powerquery


    【解决方案1】:

    在 Powerquery 中,插入具有以下公式的自定义列

    =List.Max(List.Transform(Text.Split(Text.From([Sales Potential]),","), each Number.FromText(_)))
    

    公式用逗号分割所有内容,放入一个列表,将列表从文本转换为数字,然后从列表中取出最大的数字。

    【讨论】:

      【解决方案2】:

      这个R 解决方案似乎可以满足您的需求:

      SalesPotential <- c("0, 0, 0, 0, 0", "4, 0, 0, 0","0, 0, 480","0, 200, 0")
      
      library(stringr)    
      str_extract(gsub(",", "", SalesPotential), "(?=(0\\s){4})\\d+|[1-9]+(0{1,})?")
      [1] "0"   "4"   "480" "200"
      

      使用gsub此解决方案首先删除gsub(",", "", SalesPotential) 中的逗号,将此编辑后的向量提交给str_extract。然后它继续定义两种模式,一种用于除0 之外没有其他数字的值,另一种用于以非0digits 开头并且结尾可能有一个或多个0s 的值。

      如果你想有干净的数字,转换成数字:

      as.numeric(str_extract(gsub(",", "", SalesPotential), "(?=(0\\s){4})\\d+|[1-9]+(0{1,})?"))
      [1]   0   4 480 200
      

      【讨论】:

        【解决方案3】:

        嗯,您可以通过使用 M 公式语言或使用 GUI 本身在 Power Query 本身中实现所需的结果。

        让我告诉你最简单的方法。

        如果我是正确的,那么该列有一些干净的数字和一些逗号分隔的数字。

        所以你要做的是

        每次出现时用逗号分隔列。

        因此,如果最大列数,您将获得 (n+1) 列数。任何单元格中的comman都是“n”

        现在,您必须创建一个条件列,检查所有这些列中大于零的数字并给出输出。

        这样做,您将在计算列中为脏数据获得非零数字,而对于清理数据,您将获得相同的数字。

        完成此操作后,您可以删除所有以逗号分隔的列并仅保留条件列。

        现在公式应该如下:

        if delcol1 <> 0 then delcol1 elseif delcol2 <> 0 then delcol2 elseif.......
        

        delcol2 0 然后 delcoln

        这是我能想到的最简单的解决方法。

        但是,还有其他选择也可以得到相同的答案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多