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

在R中处理字符串搜索和替换,r,string,text,substitution,R,String,Text,Substitution,我是R的初学者,以前使用过Matlab,我一直在寻找我的问题的解决方案,但我似乎没有找到。 我有一个非常大的文本输入向量。差不多 CAT06 6猫 第六类 狗3 三维日志 我希望能够找到这样一个函数:如果找到一个条目并且它包含“CAT”和“6”(无论位置如何),则替换为cat6。如果找到一个条目,并且它包含“DOG”和“3”(无论位置如何),则替换dog3。因此,结果应该是: cat6 cat6 cat6 dog3 dog3 有人能帮忙吗?非常感谢,发现自己有点迷路了 首先删除空格,即“第6类”

我是R的初学者,以前使用过Matlab,我一直在寻找我的问题的解决方案,但我似乎没有找到。 我有一个非常大的文本输入向量。差不多

CAT06 6猫 第六类 狗3 三维日志

我希望能够找到这样一个函数:如果找到一个条目并且它包含“CAT”和“6”(无论位置如何),则替换为cat6。如果找到一个条目,并且它包含“DOG”和“3”(无论位置如何),则替换dog3。因此,结果应该是:

cat6 cat6 cat6 dog3 dog3


有人能帮忙吗?非常感谢,发现自己有点迷路了

首先删除空格,即“第6类”至“第6类”等元素:

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

sp = gsub("^(?:CAT|0|6)*$", "cat6", sp)
狗的情况相同:

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

根据我在问题下的评论,问题中显示的输入是不明确的。我们将展示如何根据三个假设中的哪一个进行计算

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

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"
或者,如果需要单个输出,请添加以下内容:

paste(y, collapse = " ")
3)不带嵌入空格的向量输入将其简化为第(2)种情况,然后应用第(2)种情况


x3您如何知道“第六类”属于同一类?向量是否有某种分隔符?显示的输入不明确。它是指
“CAT06 6CAT 6 CAT 6 DOG3 3DOG”
还是
c(“CAT06”、“6CAT”、“CAT 6”、“DOG3”、“3DOG”)
还是
c(“CAT06”、“6CAT”、“CAT”、“6”、“DOG3”、“3DOG”)
。@G.grothendieck非常感谢您的输入。我会考虑你的答复,然后再回来找你@Aleksandr Voitov非常感谢您的投入。我会研究它(需要时间来思考对我来说是非常新的),然后回到你身边!
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 = " ")
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"