我正在尝试清理一个长字符向量,并且遇到一种极端情况,即无法分隔以下格式的文本: $ 4.917.10%
问题在于如何设置条件空白,以使文本看起来像这样:$ 4.91 7.10%。
向量称为“ test9”,清除%前面有“-”的典型情况的脚本是:
gsub("(?=[-])", " ", test9, perl = TRUE)
边缘情况很少见,但需要针对向量的特征进行调整。在小数点左边(无论是表示$还是%)没有固定的位数,但是在小数点右边总是有两个小数点,这使我认为有条件地接近这可能是要走的路。>
这里是向量的一个元素的大块样本:
$ 28.00 $ 25.0518.09%
谢谢!
答案 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"