我是R的初学者,之前使用过Matlab,我一直在寻找解决问题的方法,但我似乎找不到。 我有一个非常大的矢量与文本条目。像
这样的东西CAT06 6CAT CAT 6 DOG3 3DOG
我希望能够找到一个功能:如果找到一个条目,它包含“CAT”& “6”(无论位置),替代cat6。如果找到一个条目并且它包含“DOG”& “3”(无论位置)代替dog3。所以结果应该是:
cat6 cat6 cat6 dog3 dog3
有人可以帮忙吗?非常感谢你,发现自己有点失落!
答案 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
替换为x1
或x2
它仍然可以正常工作,那么如果需要单个输出字符串,则添加paste(y, collapse = " ")