选择R中特定行周围的行

时间:2019-04-03 03:17:20

标签: r

我有一些数据与我建立的这个小例子相似。其中的名称是5个传感器a-e的名称。但是,在这种情况下,e中的一个发生频率比其他情况要低得多。我需要所有5个观测值。实际数据有140k行,但是e仅出现2k行。我的问题是,我可以在适当的字段中搜索包含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 个答案:

答案 0 :(得分:1)

这可能不是最有效的解决方案,但是您基本上可以遍历每个"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