根据前一行(R)的值删除数据框中的行

时间:2016-01-25 07:06:05

标签: r data-cleaning

我尝试将数据作为数据框导入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.这是一个错误,我需要删除后一行。 因此,如果两个后续行具有相同的'事件'第二行必须删除。 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

您可以使用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 :(得分:2)

我们可以使用rleid

中的data.table执行此操作
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))

答案 2 :(得分:0)

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),第一行将被省略。请注意,如果有多个重复的连续事件,则只会保留第一个事件。