【问题标题】:R: find data frame index of multiple conditionsR:查找多个条件的数据框索引
【发布时间】:2016-09-03 22:07:05
【问题描述】:

给定两个数据框 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

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

【问题讨论】:

    标签: r conditional-statements subset min


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2021-08-29
      相关资源
      最近更新 更多