如何从字符向量中删除第一个特定重复元素
我有一个路径步骤的向量,并且有一个特定的路径步骤,如果它重复我想要消除重复.
例如, 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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |