Как удалить строки, обрамляющие блок нулевых значений - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть data.frame с необработанными данными из программного обеспечения для отслеживания глаз:

enter image description here

Строки с нулями представляют время, когда пользователь мигает. В течение небольшого периода до и после мигания калибровка устройства слежения за глазами является неточной. Поэтому я хотел бы удалить строки, которые соответствуют миганию (с 0 значениями) И 4 строки до и после каждого мигания.

Вы можете воссоздать аналогичный df:

test <- data.frame(a = sample(0:200, 200, replace = T),
                   b = sample(0:200, 200, replace = T),
                   c = sample(0:200, 200, replace = T),
                   d = sample(0:200, 200, replace = T))
test[50:100, ] <- 0

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018
library(purrr)

vec0s <- which(df$GLX == 0) #vector of zeros
indexToRemove <- map2(vec0s-4, vec0s+4, function(minVal, maxVal) {
  minVal:maxVal %>% #vector of 4 below to 4 above each row with 0
    .[minVal:maxVal > 0] #remove any negative numbers
}) %>% unlist() %>% unique() #select unique numbers in cases of overlap

df <- df[-indexToRemove,] #Remove from df
0 голосов
/ 09 сентября 2018

Раствор простого R.

В соответствии с вашим примером набора данных. Во-первых, вектор, обозначающий, где находятся нули:

> zeros <- rowSums(test) == 0
> zeros
  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [49] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [61]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [73]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [85]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [97]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[145] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

Мы добавляем несколько фальшивых ложных строк, чтобы в каждой фактической строке было по крайней мере четыре элемента до и после:

> zeros <- c(F, F, F, F, F, zeros, F, F, F, F)

Затем вычислите скользящую сумму по окну 9 (четыре строки до рассматриваемой строки, четыре строки после):

> rolling <- diff(cumsum(zeros), 9)
> rolling
  [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [38] 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
 [75] 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0
[112] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[149] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[186] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Удалить строки, которые имеют ненулевое значение соседних нулевых строк:

> output <- test[rolling == 0, ]
> rownames(output)
  [1] "1"   "2"   "3"   "4"   "5"   "6"   "7"   "8"   "9"   "10"  "11"  "12"  "13"  "14"  "15"  "16"  "17"  "18"  "19"  "20"  "21"  "22" 
 [23] "23"  "24"  "25"  "26"  "27"  "28"  "29"  "30"  "31"  "32"  "33"  "34"  "35"  "36"  "37"  "38"  "39"  "40"  "41"  "42"  "43"  "44" 
 [45] "45"  "105" "106" "107" "108" "109" "110" "111" "112" "113" "114" "115" "116" "117" "118" "119" "120" "121" "122" "123" "124" "125"
 [67] "126" "127" "128" "129" "130" "131" "132" "133" "134" "135" "136" "137" "138" "139" "140" "141" "142" "143" "144" "145" "146" "147"
 [89] "148" "149" "150" "151" "152" "153" "154" "155" "156" "157" "158" "159" "160" "161" "162" "163" "164" "165" "166" "167" "168" "169"
[111] "170" "171" "172" "173" "174" "175" "176" "177" "178" "179" "180" "181" "182" "183" "184" "185" "186" "187" "188" "189" "190" "191"
[133] "192" "193" "194" "195" "196" "197" "198" "199" "200"

Это может быть явно заключено в некоторые dplyr mutate или что-то, если есть такое желание.

РЕДАКТИРОВАТЬ: исправлено по одному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...