Удаление строк повторяющихся записей из набора данных RFID - PullRequest
1 голос
/ 31 марта 2019

У меня есть последовательность данных RFID.Каждая строка содержит метку времени и идентификатор.Я хочу удалить повторяющиеся записи.Данные выглядят так:

Row ID  Date     Time
1   A   1-13    12:03:11
2   B   1-13    12:03:12
3   A   1-13    12:06:06
4   B   1-13    12:16:25
5   A   1-13    12:16:52
6   A   1-13    12:16:53
7   A   1-13    12:16:54
8   B   1-13    12:39:46
9   B   1-13    12:41:20
10  B   1-13    12:41:20
11  B   1-13    12:41:21
12  B   1-13    12:42:20
13  B   1-13    12:42:24
14  A   1-13    12:51:37
15  A   1-13    12:51:38

Я хочу удалить те строки, которые показывают запись, которая была сделана в ту же секунду, что и запись в строке выше, ИЛИ одну секунду спустя.Поэтому в этом случае я хочу удалить строки 2,6,7,10,11 и 15.

Может ли кто-нибудь помочь мне с кодом, который делает это автоматически во всем наборе данных?

Ответы [ 3 ]

1 голос
/ 31 марта 2019

А dplyr вариант.Time Конвертировать *1002* в объект даты и времени, arrange на Time и filter только те строки, которые отличаются от предыдущей строки более чем на 1 секунду.

library(dplyr)

df %>%
  mutate(Time1 = as.POSIXct(Time, format = "%T")) %>%
  arrange(Time1) %>%
  filter(c(TRUE, diff(Time1) > 1)) %>%
  select(-Time1)

#  Row ID Date     Time
#1   1  A 1-13 12:03:11
#2   3  A 1-13 12:06:06
#3   4  B 1-13 12:16:25
#4   5  A 1-13 12:16:52
#5   8  B 1-13 12:39:46
#6   9  B 1-13 12:41:20
#7  12  B 1-13 12:42:20
#8  13  B 1-13 12:42:24
#9  14  A 1-13 12:51:37
1 голос
/ 31 марта 2019

Вы можете преобразовать столбец даты, используя as.POSIXct, а затем применить diff, чтобы получить разницу во времени, например,

v <- c("1-13 12:03:11", "1-13 12:03:12", "1-13 12:06:06", "1-13 12:16:25", 
       "1-13 12:16:52", "1-13 12:16:53", "1-13 12:16:54", "1-13 12:39:46", 
       "1-13 12:41:20", "1-13 12:41:20", "1-13 12:41:21", "1-13 12:42:20", 
       "1-13 12:42:24", "1-13 12:51:37", "1-13 12:51:38")
ind <- diff(as.POSIXct(v, format = "%m-%d %T")) <= 1
ind
# [1]  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE

Затем вы можете удалить строки, задав подмножество

# suppose your data frame is labelled df
df[!c(FALSE, ind),]    # first row should be kept
0 голосов
/ 31 марта 2019

Слегка "хакерское" решение:

library(dplyr)
new_df<-df %>% 
  mutate(To_Split=unlist(as.numeric(lapply(strsplit(df$Time,":"),function(x) x[3]))))


  new_df %>% 
  mutate_at(vars(To_Split),list(function(x) x==lag(x)|x==(lag(x)+1))) %>% 
  filter(To_Split==FALSE|is.na(To_Split)) %>% 
  select(-To_Split)

Результат:

 Row ID Date     Time
1   1  A 1-13 12:03:11
2   3  A 1-13 12:06:06
3   4  B 1-13 12:16:25
4   5  A 1-13 12:16:52
5   8  B 1-13 12:39:46
6   9  B 1-13 12:41:20
7  12  B 1-13 12:42:20
8  13  B 1-13 12:42:24
9  14  A 1-13 12:51:37
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...