Как выбрать ПОСЛЕДУЮЩИЕ строки строки данных `df1`, значения которой совпадают со значениями из вектора` A` - PullRequest
2 голосов
/ 13 апреля 2020

У меня есть длинный фрейм данных df1, для которого я хочу выбрать только те строки, которые удовлетворяют следующим: df1$Delay строки являются последовательными и полностью соответствуют значениям вектора A в одном и том же порядке. В качестве примера:

df1 <- data.frame(DateTime=c("2016-08-28 12:02:34.589","2016-08-28 12:03:23.589","2016-08-28 12:04:28.589","2016-08-28 12:07:56.589","2016-08-28 12:10:14.589","2016-08-28 12:12:34.589","2016-08-28 12:13:44.589","2016-08-28 12:15:43.589","2016-08-28 12:19:28.589","2016-08-28 12:22:34.589"),
                     Depth=c(12,34,56,12,3,45,52,23,32,18),
                     Delay=c(56,34,90,36,78,90,34,56,101,56))
df1

                  DateTime Depth Delay
1  2016-08-28 12:02:34.589    12    56
2  2016-08-28 12:03:23.589    34    34
3  2016-08-28 12:04:28.589    56    90
4  2016-08-28 12:07:56.589    12    36
5  2016-08-28 12:10:14.589     3    78
6  2016-08-28 12:12:34.589    45    90
7  2016-08-28 12:13:44.589    52    34
8  2016-08-28 12:15:43.589    23    56
9  2016-08-28 12:19:28.589    32   101
10 2016-08-28 12:22:34.589    18    56

A <- c(90,34,56)

В этом случае я бы ожидал получить его:

Result

                 DateTime Depth Delay
1 2016-08-28 12:12:34.589    45    90
2 2016-08-28 12:13:44.589    52    34
3 2016-08-28 12:15:43.589    23    56

Ответы [ 4 ]

1 голос
/ 14 апреля 2020

Вот вариант использования соединений с использованием data.table:

library(data.table)

#convert into a data.table for joning
A <- as.list(c(90, 34, 56))
v <- seq_along(A)

#lead the Delay values by steps of 0, 1, 2 and join on A
rows <- setDT(df1)[, shift(Delay, -(v - 1L))][
    A, on=paste0("V", v), which=TRUE]

#extract the first row and subsequent rows
df1[sapply(rows, function(k) k + seq_along(A) - 1L)]
1 голос
/ 13 апреля 2020

A loop решение

library(data.table)

df1 <- data.frame(DateTime=c("2016-08-28 12:02:34.589","2016-08-28 12:03:23.589","2016-08-28 12:04:28.589","2016-08-28 12:07:56.589","2016-08-28 12:10:14.589","2016-08-28 12:12:34.589","2016-08-28 12:13:44.589","2016-08-28 12:15:43.589","2016-08-28 12:19:28.589","2016-08-28 12:22:34.589"),
                  Depth=c(12,34,56,12,3,45,52,23,32,18),
                  Delay=c(56,34,90,36,78,90,34,56,101,56))
df1
#>                   DateTime Depth Delay
#> 1  2016-08-28 12:02:34.589    12    56
#> 2  2016-08-28 12:03:23.589    34    34
#> 3  2016-08-28 12:04:28.589    56    90
#> 4  2016-08-28 12:07:56.589    12    36
#> 5  2016-08-28 12:10:14.589     3    78
#> 6  2016-08-28 12:12:34.589    45    90
#> 7  2016-08-28 12:13:44.589    52    34
#> 8  2016-08-28 12:15:43.589    23    56
#> 9  2016-08-28 12:19:28.589    32   101
#> 10 2016-08-28 12:22:34.589    18    56

setDT(df1)

A <- c(90,34,56)

df1[,flag:={v <- vector()
for (i in 1:.N) {
  if (identical(Delay[(i):(i+2)],A)) {
    v[(i):(i+2)] <- TRUE
  } else if (is.na(v[i])){
    v[i] <- FALSE
  }
}
v}]

df1[flag==TRUE]
#>                   DateTime Depth Delay flag
#> 1: 2016-08-28 12:12:34.589    45    90 TRUE
#> 2: 2016-08-28 12:13:44.589    52    34 TRUE
#> 3: 2016-08-28 12:15:43.589    23    56 TRUE

Создано в 2020-04-13 пакетом Представить (v0.3.0)

1 голос
/ 13 апреля 2020

Получение помощи от @G. Ответ Grothendieck в этом сообщении, мы можем использовать его как:

inds <- which(zoo::rollapplyr(df1$Delay, length(A), function(x) 
                   all(A == x), fill = NA))

df1[c(mapply(`:`, inds - 2, inds)), ]

#                 DateTime Depth Delay
#1 2016-08-28 12:12:34.589    45    90
#2 2016-08-28 12:13:44.589    52    34
#3 2016-08-28 12:15:43.589    23    56

Если у нас есть только одно такое вхождение в наборе данных, мы можем пропустить часть mapply.

df1[(inds - length(A) + 1) : inds, ]
1 голос
/ 13 апреля 2020

Вот базовое решение R

dfout <- Filter(length,
                sapply(which(df1$Delay==head(A,1)),
                       function(k) {if (all(df1$Delay[k-1+seq_along(A)]==A)) df1[k-1+seq_along(A),] else NULL}))

, уступающее

> dfout
[[1]]
                 DateTime Depth Delay
6 2016-08-28 12:12:34.589    45    90
7 2016-08-28 12:13:44.589    52    34
8 2016-08-28 12:15:43.589    23    56
...