如何删除 r 中的特定(并排)重复项?

Posted

技术标签:

【中文标题】如何删除 r 中的特定(并排)重复项?【英文标题】:How to remove specific (side-by-side) duplicates in r? 【发布时间】:2022-01-19 06:44:29 【问题描述】:

假设我有以下字符串:

l1 = c(0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1)

而我只想保留“FIRST new 1”,也就是我对上面强的渴望结果是:

l1 = c(0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)

我尝试移动和减去列表,无论不是 1,都设置为 0;但是这种方式行不通。

【问题讨论】:

你可以做l1[c(FALSE, diff(l1) == 0)] <- 0 【参考方案1】:

你可以试试(基础R方式)

x <- c(0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1)
y <- rle(x)
z<- cumsum(y$lengths)[y$values == 0] + 1
w <- rep(0, length(x))
w[z] <- 1
w

 [1] 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1

dplyr方式

library(dplyr)
library(xts)
library(data.table)

x <- data.frame(
  l1 = c(0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1)
)
x %>%
  mutate(y = rleid(l1)) %>%
  group_by(y) %>%
  mutate(l1 = ifelse((y %% 2) == first(l1) & row_number(y)>1, 0, l1)) %>%
  ungroup %>%
  select(-y) %>%
  pull(l1)


 [1] 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1

【讨论】:

完美运行!谢谢你,恭喜你 10k !!【参考方案2】:

笨方法

bool IsNewOneAppeared = 0
for(int i;i<c.length;i++)

   if(IsNewOneAppeared )
   c[i]= 0;
   else if(c[i] equal 1)
   
     keep 1;
     IsNewOneAppeared =1;
   

【讨论】:

以上是关于如何删除 r 中的特定(并排)重复项?的主要内容,如果未能解决你的问题,请参考以下文章

从表中的多个重复项中删除特定记录

如何在不删除先前相同值的情况下选择具有重复项的列表中的特定数字?

Oracle SQL:如何删除 listagg 中的重复项

如何删除特定数据集中的重复项?

删除列表中的重复对象 (C#)

【R去重】 保留第一个重复/去所有的重复