边缘条件空格R

时间:2019-01-12 23:18:30

标签: r string data-cleaning stringr

我正在尝试清理一个长字符向量,并且遇到一种极端情况,即无法分隔以下格式的文本: $ 4.917.10%

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

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

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

边缘情况很少见,但需要针对向量的特征进行调整。在小数点左边(无论是表示$还是%)没有固定的位数,但是在小数点右边总是有两个小数点,这使我认为有条件地接近这可能是要走的路。

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

$ 28.00 $ 25.0518.09%

谢谢!

2 个答案:

答案 0 :(得分:0)

一个选择是分两个阶段进行。首先在第二个小数点后插入一个空格。然后删除%

之前插入的多余空间
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"

答案 1 :(得分:0)

这是另一个选择。

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

我们在(?<=\\.\\d{2})后面有一个正向的寻找点和两位数字,在%之前是一个负向的(?!%)


更一般地说,我想您可能还会有“ $ 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"