【问题标题】:Loop to remove all entries which are successively repetitive循环删除所有连续重复的条目
【发布时间】:2017-08-17 21:38:07
【问题描述】:

参考上图。我想删除所有连续重复引用仅第三列的条目。

首先它应该检查第 1 和第 2 行,如果第 3 列相同,则删除第 2 行并检查第 1 和第 3 行,依此类推。如果两个连续行的第 3 列不同,则不执行任何操作并增加行以检查接下来的两个。

这是我能得到的最接近的。

for ( i in 1:2493658) { if (newcol2[i,3]== newcol2[i+1,3]) newcol3 <- newcol2[-c(i+1),] }

【问题讨论】:

    标签: r loops


    【解决方案1】:

    可重现的例子

    df <- data.frame(Customer=1:6,
                     Invoice=letters[1:6],
                     Sales.Rep.ID=rep(c(10,20),each=3),
                     stringsAsFactors=F)
    

    dplyr 解决方案

    library(dplyr)
    desired <- df %>%
                 mutate(dup = duplicated(Sales.Rep.ID)) %>%
                 filter(dup==F) %>%
                 select(-dup)
    

    输出

      Customer Invoice Sales.Rep.ID
    1        1       a           10
    2        4       d           20
    

    【讨论】:

    • 所以如果Sales.Rep.ID是10、20、10。我不想删除第三行的10。仅在连续出现时才删除。
    • 你能更新你原来的帖子吗?你说要先比较第1行和第2行...如果第3列相同,删除第2行...然后比较第1行和第3行...如果第3列相同,会发生什么?
    • 删除第 3 行。相同的过程继续进行,直到您在第 3 行中获得不同的值,在这种情况下,什么也不做,并在下一行再次继续相同的过程。
    【解决方案2】:
    newcol3 <- newcol2[cumsum(rle(as.numeric(newcol2[,3]))$lengths),]
    newcol4 <- newcol2[cumsum(rle(as.numeric(newcol2[,3]))$lengths)- rle(as.numeric(newcol2[,3]))$lengths +1,]
    

    第一个删除顶部重复值并保留最后一个,而第二个保留顶部值并删除其余部分。 这就是我一直在寻找的。 还是谢谢你

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-16
      • 2017-12-27
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2018-12-01
      相关资源
      最近更新 更多