【问题标题】:R - remove "one after another" duplicatesR - 删除“一个接一个”重复
【发布时间】:2015-05-13 10:39:35
【问题描述】:

我试图找到一种方法来删除 R 语言中的连续重复。我有一个zoo 对象,例如:

2015-01-01 12:00:00    1
2015-01-01 13:00:00    1
2015-01-01 14:00:00    1
2015-01-01 15:30:00    4
2015-01-01 16:00:00    1
2015-01-01 17:00:00    6

而我的预期结果是:

2015-01-01 12:00:00    1
2015-01-01 15:30:00    4
2015-01-01 16:00:00    1
2015-01-01 17:00:00    6

当我使用重复功能时,它也会在重复项 (1) 不连续出现时删除它们。

谁能给我一个提示如何写这个或者是否已经有一个可用的函数?

【问题讨论】:

  • data[sequence(rle(c(1,1,1,4,1,6))$lengths) == 1, ] 或 data[which(sequence(rle(c(1,1,1,4,1,6))$lengths) == 1), ] 可能我更安全
  • @rawr 不错。只需将c 替换为列名并作为答案发布。这是这里的评论部分:)。谢谢。
  • 顺便说一句,data.table v >= 1.9.5 我会做library(data.table) ; setDT(df)[df[, .I[1L], by = rleid(V2)]$V1]。但这在这里可能没有必要。

标签: r duplicates zoo


【解决方案1】:

您可以使用运行长度编码长度来挑选您想要的行。如果在 cumsum 中使用 raw ,它将为您提供序列中的 last 值,但您可以通过从累积总和中减去长度并加一来获得第一个值。

x <- data.frame(Date=Sys.Date()+0:5,Value=c(1,1,1,4,1,6))
lens <- rle(x$Value)$lengths
select <- cumsum(lens)-lens+1
x[select,]
        Date Value
1 2015-05-13     1
4 2015-05-16     4
5 2015-05-17     1
6 2015-05-18     6

【讨论】:

    【解决方案2】:

    使用 dplyr 和 lubridate,你可以这样做:

    library(dplyr)
    library(lubridate)
    
    DF <- data.frame(Date=c("2015-01-01 12:00:00",
                            "2015-01-01 13:00:00","2015-01-01 15:30:00"),
                     name1=c(1, 1, 4))
    
    DF %>%
      mutate(Date = ymd_hms(as.character(Date))) %>%
      filter(Date - hours(1) > lag(Date) | is.na(lag(Date)))
    

    dplyr 可让您引用上面的一行 (lag),lubridate 可让您计算日期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-19
      • 2021-09-13
      • 2019-01-20
      • 2011-02-12
      • 2022-07-10
      • 2017-03-13
      • 1970-01-01
      • 2018-06-10
      相关资源
      最近更新 更多