【问题标题】:Removing a row in a data frame depending on the value of the previous row (R)根据前一行 (R) 的值删除数据框中的一行
【发布时间】:2016-05-01 10:10:04
【问题描述】:

在将一些数据作为数据框导入 R 后,我正在尝试清理这些数据。 我的数据如下所示:

Event      Time
  A      10:59:36
  B      11:00:27
  A      11:01:36
  B      11:02:01
  A      11:02:15
  A      11:02:20
  B      11:02:45

时间在 POSIXct 对象中。事件是字符串。 数据的正确形式应该是: A 后跟 B。 但是,有时 A 后面跟着 A,B 后面跟着 B。这是一个错误,我需要删除后一行。 因此,如果两个后续行具有相同的“事件”值,则必须删除第二行。 任何帮助将不胜感激。

【问题讨论】:

  • 事件“A”和“B”是否有可能不相等

标签: r data-cleaning


【解决方案1】:

你可以使用cumsum()rle()函数来实现你想要的:

events <- data.frame(Event=c("A", "B", "A", "B", "A", "A", "B"),
                     Time=c("10:59:36", "11:00:27", "11:01:36",
                            "11:02:01", "11:02:15", "11:02:20", "11:02:45"))

rows.keep <- cumsum(rle(as.numeric(events[,1]))$lengths)
y <- c(FALSE, rows.keep[1:length(rows.keep)-1] == rows.keep[2:length(rows.keep)] - 2)
rows.keep[y] <- rows.keep[y] - 1
events <- events[rows.keep, ]

> events
  Event                Time
1     A 2016-01-25 10:59:36
2     B 2016-01-25 11:00:27
3     A 2016-01-25 11:01:36
4     B 2016-01-25 11:02:01
5     A 2016-01-25 11:02:15
6     B 2016-01-25 11:02:45

【讨论】:

  • 这不会删除第一次出现的错误数据吗?
  • 是的,想保留第一个,去掉第二个
  • 这是我复制粘贴您的确切代码时的输出:事件时间 1 A 10:59:36 2 B 11:00:27 3 A 11:01:36 4 B 11:02:01 6 A 11:02:20 7 B 11:02:45 当我试用代码时, cumsum(rle(as.numeric(events[,1]))$lengths) 给出 [1] 1 2 3 4 6 7,所以 events[5] 被删除。我想保留事件 [5] 并删除事件 [6]。希望这说明清楚。谢谢。
  • @nef 我更新了我的答案,现在可以正常工作。目前不确定这是否重要,但请随时查看。
【解决方案2】:

我们可以使用来自data.tablerleid 来做到这一点

library(data.table)
setDT(df1)[!duplicated(rleid(Event))]
#     Event     Time
#1:     A 10:59:36
#2:     B 11:00:27
#3:     A 11:01:36
#4:     B 11:02:01
#5:     A 11:02:15
#6:     B 11:02:45

数据

df1 <- structure(list(Event = c("A", "B", "A", "B", "A", 
 "A", "B"), 
Time = c("10:59:36", "11:00:27", "11:01:36", "11:02:01", 
"11:02:15", "11:02:20", "11:02:45")), .Names = c("Event", 
"Time"), class = "data.frame", row.names = c(NA, -7L))

【讨论】:

    【解决方案3】:

    dplyr 解决方案。 row_number 条件对我来说有点笨拙,但它可能比其他解决方案更具可读性。

    library(dplyr)
    
    Time <- as.POSIXct("2016-01-25 10:59:36")
    set.seed(10)
    dat <-
      data_frame(Event = sample(c("A", "B"), size = 15, replace = TRUE)) %>%
      mutate(Time = Sys.time() + rnorm(15, 0, 999)) %>%
      arrange(Time)
    
    dat %>%
      arrange(Time) %>%
      filter(Event != lag(Event) | row_number(Time) == 1)
    # Source: local data frame [9 x 2]
    # 
    # Event                Time
    # (chr)              (time)
    # 1     B 2016-01-25 18:36:16
    # 2     A 2016-01-25 18:46:30
    # 3     B 2016-01-25 18:55:18
    # 4     A 2016-01-25 18:58:18
    # 5     B 2016-01-25 19:03:10
    # 6     A 2016-01-25 19:07:20
    # 7     B 2016-01-25 19:09:24
    # 8     A 2016-01-25 19:14:35
    # 9     B 2016-01-25 19:26:27
    

    没有| row_number(Time) == 1),第一行将被省略。请注意,如果有多个重复的连续事件,则只会保留第一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-13
      • 2019-02-04
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      相关资源
      最近更新 更多