R:查找多个条件的数据帧索引

时间:2016-09-03 22:07:06

标签: r conditional-statements subset min

给定两个数据框sq,每个数据框有五个观察值:

set.seed(8)
s <- data.frame(id=sample(c('Z','X'), 5, T),
                t0=sample(1:10, 5, T), 
                t1 = sample(11:30, 5, T))

q <- data.frame(id=sample(c('Z','X'), 5, T),
                 t0=sample(1:10, 5, T), 
                 t1 = sample(11:30, 5, T))


> s
  id t0 t1
1  Z  8 20
2  Z  3 12
3  X 10 19
4  X  8 21
5  Z  7 13

> q
  id t0 t1
1  X  3 30
2  Z  5 12
3  Z  7 23
4  Z  3 21
5  X  7 27

变量t0和t1之间观察的中点是(例如s数据):

s$t0+(s$t1-s$t0)/2

要查找中点最接近的s中(第一次)观察的索引,比如q我可以做的第一次观察:

i <- which.min(abs((s$t0+(s$t1-s$t0)/2 - (q$t0[1]+(q$t1[1]-q$t0[1])/2)))
s[i,]

给出:

    id t0 t1
3  X 10 19

但我无法弄清楚如何在原始数据s中找到相同的索引,如果我还想对id变量进行条件化(例如伪代码如:which.min(....) & s$id == q$id[1] - 在这种情况下是中点在'X'中寻找ids。这个SO很接近但不是现场。 再说一遍:我需要在原始的5行数据集中使用索引。

1 个答案:

答案 0 :(得分:1)

在不遵守条件时将which.min参数设置为无穷大:

val <- abs((s$t0+(s$t1-s$t0)/2 - (q$t0[1]+(q$t1[1]-q$t0[1])/2))
val[s$id != q$id[1]] <- Inf
i <- which.min(val)

顺便说一句,您可以将第一个字符中的表达式简化为:

val <- abs((s$t0+s$t1)/2-(q$t0[1]+q$t1[1])/2)

甚至

val <- abs(s$t0+s$t1-q$t0[1]-q$t1[1])/2