使用
stringr
包中的函数
str_replace_all
,我认为可以通过以下正则表达式
([0-9]+),\\1
来得到您想要的内容,然后用
\\1
替换它(我们需要转义
\
特殊字符):
library(stringr)
> str_replace_all("5,19,23,19", "([0-9]+),\\1", "\\1")
[1] "5,19,23,19"
> str_replace_all("10,10", "([0-9]+),\\1", "\\1")
[1] "10"
> str_replace_all("2,14,14,19", "([0-9]+),\\1", "\\1")
[1] "2,14,19"
您可以使用数组形式:
x <- c("5,19,23,19", "10,10", "2,14,14,19")
,然后:
str_replace_all(x, "([0-9]+),\\1", "\\1")
[1] "5,19,23,19" "10" "2,14,19"
或者使用
sapply
:
result <- sapply(x, function(x) str_replace_all(x, "([0-9]+),\\1", "\\1"))
然后:
> result
5,19,23,19 10,10 2,14,14,19
"5,19,23,19" "10" "2,14,19"
注意:
第一行是属性信息:
> str(result)
Named chr [1:3] "5,19,23,19" "10" "2,14,19"
- attr(*, "names")= chr [1:3] "5,19,23,19" "10,10" "2,14,14,19"
如果您不想看到它们(这不会影响结果),只需执行以下操作:
attributes(result) <- NULL
然后,
> result
[1] "5,19,23,19" "10" "2,14,19"
关于使用的正则表达式的解释:([0-9]+),\\1
([0-9]+)
:以第一组开始,由()
分隔,并查找任何数字(至少一个)
,
:然后是一个标点符号:,
(我们可以在这里包括空格,但原始示例仅使用此字符作为分隔符)
\\1
:接下来是与组1相同的字符串,即重复的数字。如果不是这样,则模式不匹配。
然后,如果模式匹配,则将其替换为变量\\1
的值,即模式中第一次出现的数字。
如何处理多个重复数字,例如2,14,14,14,19
?:
只需使用这个正则表达式:
([0-9]+)(,\\1)+
,那么它会在分隔符(右侧)和数字至少重复一次时匹配。您可以尝试使用
regex101.com进行其他可能性的匹配(在我看来,它比其他在线正则表达式检查器更加用户友好)。我希望这对您有用,它是一个灵活的解决方案,您只需要根据需要调整模式即可。
x <- "5,19,23,19"
,x <- strsplit(x, ",")
,然后:paste(rle(x)$values, collapse = ",")
,我得到了:[1] "c(\"5\", \"19\", \"23\", \"19\")"
。 - David Lealrle
函数,在这种情况下,首先需要对值进行排序,我不知道这是否与 @SebastianEttner 的问题相关。例如:x <- c(2,2,1,2,3,2,1,3,3,2,1)
,然后:rle(x)$value
将是:[1] 2 1 2 3 2 1 3 2 1
,但使用:rle(x[order(x)])
我们得到:rle(x[order(x)])$value
将为:[1] 1 2 3
。 - David Lealunique
。您获得的输出原因是因为您尚未首先探索strsplit(x, ",")
的输出。 - David Arenburgx <- strsplit(x, ",")[[1]]
,现在我得到的是:[1] "5,19,23,19"
重复的值(19)仍然存在。 - David Leal