在R中处理字符串搜索和替换

时间:2017-03-30 13:44:30

标签: r string text substitution

我是R的初学者,之前使用过Matlab,我一直在寻找解决问题的方法,但我似乎找不到。 我有一个非常大的矢量与文本条目。像

这样的东西

CAT06 6CAT CAT 6 DOG3 3DOG

我希望能够找到一个功能:如果找到一个条目,它包含“CAT”& “6”(无论位置),替代cat6。如果找到一个条目并且它包含“DOG”& “3”(无论位置)代替dog3。所以结果应该是:

cat6 cat6 cat6 dog3 dog3

有人可以帮忙吗?非常感谢你,发现自己有点失落!

2 个答案:

答案 0 :(得分:0)

首先删除空格,即“CAT 6”到“CAT6”等元素:

sp = gsub(" ", "", c("CAT06", "6CAT", "CAT 6", "DOG3", "3DOG"))

然后使用一些正则表达式魔法找到“CAT”,“0”,“6”的任意组合,并将这些匹配替换为“cat6”,如下所示:

sp = gsub("^(?:CAT|0|6)*$", "cat6", sp)

DOG 案例相同:

sp = gsub("^(?:DOG|0|3)*$", "dog3", sp)

答案 1 :(得分:0)

根据我在问题中的评论,问题中显示的输入是不明确的。我们将根据三种假设中的哪一种来说明如何计算它。

1)带有嵌入空格的矢量输入删除第一个"[0-9 ]"中的数字和空格(gsub)并删除非数字("\\D")在第二个gsub转换为数字以避免前导零然后粘贴在一起:

x1 <- c("CAT06", "6CAT", "CAT 6", "DOG3", "3DOG") # test input

paste0(gsub("[0-9 ]", "", x1), as.numeric(gsub("\\D", "", x1)))
## [1] "CAT6" "CAT6" "CAT6" "DOG3" "DOG3"

2)单个字符串表单chars删除所有数字并扫描结果。然后通过删除除数字和空格以外的所有内容并扫描结果来形成nums。最后将它们粘贴在一起。

x2 <- "CAT06 6CAT CAT 6 DOG3 3DOG" # test input

chars <- scan(textConnection(gsub("\\d", "", x2)), what = "", quiet = TRUE)
nums <- scan(textConnection(gsub("[^ 0-9]", "", x2)), , quiet = TRUE)
y <- paste0(chars, nums)
y
## [1] "CAT6" "CAT6" "CAT6" "DOG3" "DOG3"

或者如果需要单个输出搅拌,请添加:

paste(y, collapse = " ")

3)没有嵌入空格的矢量输入将此缩小为大小写(2)然后应用(2)。

x3 <- c("CAT06", "6CAT", "CAT", "6", "DOG3", "3DOG") # test input

xx <- paste(x3, collapse = " ")
chars <- scan(textConnection(gsub("\\d", "", xx)), what = "", quiet = TRUE)
nums <- scan(textConnection(gsub("[^ 0-9]", "", xx)), , quiet = TRUE)
y <- paste0(chars, nums)
y
## [1] "CAT6" "CAT6" "CAT6" "DOG3" "DOG3"

请注意,这实际上适用于所有三个输入。也就是说,如果我们将x3替换为x1x2它仍然可以正常工作,那么如果需要单个输出字符串,则添加paste(y, collapse = " ")