A > X > B > X > X > X > C > C" 现在,如果“X”重复,那么-6ren">
gpt4 book ai didi

r - 如何从字符向量中的第一个元素之后删除特定的重复元素

转载 作者:行者123 更新时间:2023-12-04 12:10:19 25 4
gpt4 key购买 nike

我有一个路径步骤向量,并且有一个特定的路径步骤,如果它重复,我想消除重复。

例如,

my_vec = "A > A > X > B > X > X > X > C > C"

现在,如果“X”重复,那么我想消除除第一个重复之外的所有 X 重复,同时保留其余元素的顺序,这样我想要的结果是:

my_vec = "A > A > X > B > X > C > C",其中重复的 X 从中间消除。

我用 for 循环和 if-else 组合尝试了这个,这样我会检测向量中的前一个元素是否也包含“X”,然后用 NA 替换该元素,然后我可以删除 NA 项,但这种方法并没有提供预期的结果。

我试着寻找 herehere ,但这些只是过滤掉独特的元素,而我想对特定元素执行此操作。

这是我的代码:

my_vec <- unlist(str_split(my_vec, '>') )

for (i in length(my_vec)){
if (grepl('X', my_vec[i]) & grepl('X', my_vec[i-1])) {
steps[i] <- NA

} else {
next()
}}
my_new_vec <- str_c(steps, collapse = '>')

但是,输出与输入完全相同,没有任何内容变为 NA。

最佳答案

1) gsub 用该序列中的最后一个匹配项替换任何重复的 X 序列(可能后跟空格和大于字符)。如果序列在末尾,这也有效。如果我们知道序列不在末尾,例如问题中的示例,那么我们可以将第一个参数简化为 "(X > )*"

gsub("(X[> ]*)*", "\\1", my_vec)
## [1] "A > A > X > B > X > C > C"

2) strsplit/rle 如果您更喜欢在问题的代码中使用 strsplit,请尝试将其与 rle 结合使用。首先我们执行strsplit 生成as 然后应用rle 得到r。现在,对于 "X " 的每次运行,将其长度更改为 1,并将运行倒置,将 ss 的去重版本作为 s。最后转换为字符串并删除前导和尾随空格。

ss <- strsplit(paste0(" ", my_vec, " "), ">")[[1]]
r <- rle(ss)
r$lengths[r$values == " X "] <- 1
s <- inverse.rle(r)
trimws(paste(s, collapse = ">"))
## "A > A > X > B > X > C > C"

(2a) 下面是另一种同样使用 strsplit 的方法。这里的首末行代码与(2)中的首末行代码相同。

ss <- strsplit(paste0(" ", my_vec, " "), ">")[[1]]
s <- ss[!c(FALSE, ss[-1] == ss[-length(ss)] & ss[-1] == " X ")]
trimws(paste(s, collapse = ">"))
## "A > A > X > B > X > C > C"

更新:处理序列在末尾的情况并添加 (2) 和 (2a)。

关于r - 如何从字符向量中的第一个元素之后删除特定的重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45219708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com