Выбор строк вокруг определенной строки в R - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть некоторые данные, которые похожи на этот небольшой пример, который я построил. Где имена те из 5 датчиков a-e. Однако один из них в данном случае e встречается гораздо реже, чем другие. Мне нужно все 5 для того, что мы будем называть наблюдением. Фактические данные имеют 140 тыс. Строк, но только 2 тыс. Вхождений e. У меня вопрос: могу ли я найти строки, которые содержат e в соответствующем поле, а затем посмотреть на строки выше / ниже для ближайшего a-d, чтобы завершить наблюдение? Моя цель - вернуть эти строки полностью. Я не могу соединить точки.

Так дано:

   name num val
1     a   1   1
2     b   2   4
3     c   3   9
4     d   4  16
5     c   5  25
6     e   6  36
7     b   7  49
8     d   8  64
9     c   9  81
10    d  10 100
11    c  11 121
12    a  12 144
13    c  13 169
14    b  14 196
15    e  15 225
16    d  16 256
17    c  17 289
18    b  18 324
19    d  19 361
20    c  20 400
21    d  21 441
22    c  22 484
23    a  23 529
24    c  24 576
25    b  25 625

Я бы хотел:

     name num val
1     a   1   1
2     b   2   4
3     c   3   9
4     d   4  16
6     e   6  36
12    a  12 144
14    b  14 196
13    c  13 169
16    d  16 256
15    e  15 225

Или даже:

[[1]]
  name num val
1    a   1   1
2    b   2   4
3    c   3   9
4    d   4  16
6    e   6  36

[[2]]
   name num val
12    a  12 144
14    b  14 196
13    c  13 169
16    d  16 256
15    e  15 225

Хотя это не имеет значения, если они заказаны, просто все 5 присутствуют.

1 Ответ

1 голос
/ 05 апреля 2019

Вероятно, это не самое эффективное из возможных решений, но вы можете по существу зациклить расположение каждого "e" и выбрать ближайшую букву:

es <- which(dat$name=="e")
oths <- lapply(c("a","b","c","d"), function(x) which(dat$name == x) )
cmp <- sapply(es, function(x) sapply(oths, function(y) y[which.min(abs(y-x))]))
dat[sort(c(es,cmp)),]

#   name num val
#1     a   1   1
#4     d   4  16
#5     c   5  25
#6     e   6  36
#7     b   7  49
#12    a  12 144
#13    c  13 169
#14    b  14 196
#15    e  15 225
#16    d  16 256
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...