加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何从字符向量中删除第一个特定重复元素

发布时间:2020-12-15 04:39:46 所属栏目:Java 来源:网络整理
导读:我有一个路径步骤的向量,并且有一个特定的路径步骤,如果它重复我想要消除重复. 例如, my_vec = "A A X B X X X C C" 现在如果’X’重复,那么除了第一个之外我想要消除X的所有重复,同时保留其余元素的顺序,这样我想要的结果是: my_vec =“A A X B X C C”,其
我有一个路径步骤的向量,并且有一个特定的路径步骤,如果它重复我想要消除重复.

例如,

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项,但这种方法没有提供所需的结果.

我尝试查找here和here,但这些只是过滤掉了独特的元素,而我想对特定元素执行此操作.

这是我的代码:

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(" ",">")[[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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读