【问题标题】:Edge Conditional White Space Issue R边缘条件空白问题 R
【发布时间】:2019-06-07 10:52:20
【问题描述】:

我正在尝试清理一个长字符向量,并且遇到了一个无法分离以下文本格式的边缘情况: $4.917.10%

问题是如何设置条件空白,使文本看起来像这样:$4.91 7.10%。

向量称为“test9”,清除%前面有“-”的典型情况的脚本是:

gsub("(?=[-])", " ", test9, perl = TRUE)

边缘情况并不常见,但需要调整向量的一个特征。小数点左侧没有固定位数(无论是表示 $ 还是 %),但小数点右侧总是有两位小数,这让我认为有条件地逼近这可能是要走的路。

这里是向量的一个元素的一大块样本:

$28.00$25.0518.09%

谢谢!

【问题讨论】:

    标签: r string data-cleaning stringr


    【解决方案1】:

    一种选择是分两个阶段进行。首先在每个小数点后插入一个空格。然后删除 % 之前插入的不需要的空间

    x = '$28.00$25.0518.09%' 
    y = gsub('(\\.\\d{2})', '\\1 ', x, perl = T) #insert space after decimals
    trimws(gsub('\\s%', '% ', y))  # move space from before % to after %
    # "$28.00 $25.05 18.09%"
    

    这也应该适用于@Julius 描述的更一般的情况

    x = "$28.00$25.0518.09%18.09%"  # "$28.00 $25.05 18.09% 18.09%"
    x = "$28.00$25.0518.09%-7.10%$25.05-$25.05$25.05" # "$28.00 $25.05 18.09% -7.10% $25.05 -$25.05 $25.05"
    

    【讨论】:

      【解决方案2】:

      这是另一种选择。

      gsub("(?<=\\.\\d{2})(?!%)", " ", "$28.00$25.0518.09%", perl = TRUE)
      # [1] "$28.00 $25.05 18.09%"
      

      我们对(?&lt;=\\.\\d{2}) 进行正向lookbehind 寻找一个点和两个数字,并在(?!%) 寻找%。


      更一般地说,我猜你可能还有“$28.00$25.0518.09%18.09%”,在这种情况下我们需要别的东西:

      gsub("((?<=\\.\\d{2})|(?<=%))(?=[\\d$])", " ", "$28.00$25.0518.09%18.09%", perl = TRUE)
      # [1] "$28.00 $25.05 18.09% 18.09%"
      

      现在我们要么对点和两个数字进行正向回溯,要么对 % 进行正向回溯,对数字或字符结尾进行正向预读。


      如果我理解正确,您的一般问题是“$28.00$25.0518.09%-7.10%$25.05-$25.05$25.05”的形式,那么我们可以使用与后者几乎相同的解决方案:

      gsub("((?<=\\.\\d{2})|(?<=%))(?=[\\d$-])", " ", "$28.00$25.0518.09%-7.10%$25.05-$25.05$25.05", perl = TRUE)
      # [1] "$28.00 $25.05 18.09% -7.10% $25.05 -$25.05 $25.05"
      

      【讨论】:

      • @js80,现在我想你也可能有 $28.00$25.0518.09%18.09%,对吧?我更新了我的答案。
      猜你喜欢
      • 2023-03-25
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      相关资源
      最近更新 更多