Удаление двух определенных элементов и всех элементов в столбце данных - PullRequest
0 голосов
/ 14 октября 2019

Я работаю с программой отслеживания, которая отслеживает объекты на координатной плоскости XY. Я использовал это для вычисления изменения положения в координате y, однако у меня остались некоторые артефакты из программного обеспечения для отслеживания. Обычно трекер прыгает в угол, остается там на несколько кадров и отскакивает назад. Мои данные в конечном итоге будут выглядеть примерно так:

yposition <- c(400,402,403,404,405,407,80,81,83,80,402,401,399,397, 398, 398, 653, 653, 654, 395, 392, 391)
dataframe <- data.frame(yposition)
velocity <- c(0,2,1,1,1,2,327,1,2,2,-322, -1,-1, -2, 1, 0, -255, 0, 1, 259, -3, -1)
dataframe <- cbind(dataframe,velocity)

Артефакты в этом случае могут быть, когда yposition перепрыгивает на 80 и обратно, а также на 653 и обратно. Есть ли способ удалить значения changeinposition, соответствующие этим артефактам (в этом случае элементы от 327 до -322 и элементы от -255 до 259)?

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Если удаление основано на скорости, нам нужно удалить строки и последующие строки, где скорость резко изменяется до тех пор, пока не встретится другое резкое изменение .:

# threshold for velocity
threshold <- 5
isAbnormal <- abs(dataframe$velocity) > threshold
indexes <- which(isAbnormal)

Начиная с начальной и конечной строк, которые нам нужно удалитьвсегда появляются парами, поэтому мы знаем, что нам нужно удалить строки с 7 по 11 и с 17 до 20.

> indexes 
[1]  7 11 17 20

Нам нужно удалить две пары (7:11 и 17:20):

pairs <- split(indexes,rep(1:(length(indexes)/2),times = 1,each = 2))
> pairs
$`1`
[1]  7 11

$`2`
[1] 17 20

Преобразование пар в вектор и удаление этих строк:

remove_rows <- Reduce(
    function(x,y) c(x,y),
    Map(function(x) x[1]:x[2],pairs)
)

> remove_rows
[1]  7  8  9 10 11 17 18 19 20
> dataframe[-remove_rows,]
   yposition velocity
1        400        0
2        402        2
3        403        1
4        404        1
5        405        1
6        407        2
12       401       -1
13       399       -1
14       397       -2
15       398        1
16       398        0
21       392       -3
22       391       -1
0 голосов
/ 15 октября 2019

Это немного сложно на практике, потому что не ясно, как идентифицировать ваш базовый уровень, а не прыжок.

Если мы предположим, что ваша серия всегда начинается с уровня normal, вы можете использовать комбинацию diff и cumsum, чтобы исключить скачки из сигнала:

jump.level <-  150 # this value is arbitrary
yposition[abs(cumsum(c(0, diff(yposition)))) < jump.level]
# [1] 400 402 403 404 405 407 402 401 399 397 398 398 395 392 391

Для фильтрацииВы data.frame, вы можете извлечь индексы элементов, которые соответствуют условию выше с which:

i <- which(abs(cumsum(c(0, diff(yposition)))) < jump.level)
dataframe[i, ]


...