代码之家  ›  专栏  ›  技术社区  ›  gakera

在r中:通过布尔比较范围内的值来索引向量:index==c(min:max)

r
  •  7
  • gakera  · 技术社区  · 14 年前

    在r中,假设我们有一个向量
    area = c(rep(c(26:30), 5), rep(c(500:504), 5), rep(c(550:554), 5), rep(c(76:80), 5)) 还有另一个向量 yield = c(1:100) .
    现在,假设我想这样索引:

    > yield[area==27]
    [1]  2  7 12 17 22
    > yield[area==501]
    [1] 27 32 37 42 47
    

    没问题,对吧?但当我试图用 c(A, B) . (当我尝试的时候更奇怪 c(min:max) ……)

    > yield[area==c(27,501)]
    [1]  7 17 32 42
    

    我所期待的当然是其他两个例子中出现的实例,而不仅仅是它们的一些奇怪的组合。当我可以使用管道或操作器时,这是有效的:

    > yield[area==27 | area==501]
     [1]  2  7 12 17 22 27 32 37 42 47
    

    但是如果我在使用靶场呢?假设我要按范围索引它 c(27:503) ?在我的实际示例中,有更多的数据点和范围,因此它更有意义,请不要建议我手工操作,这实际上意味着:

    yield[area==27 | area==28 | area==29 | ... | area==303 | ... | area==500 | area==501]
    

    一定有更好的方法…

    2 回复  |  直到 14 年前
        1
  •  6
  •   Joshua Ulrich    14 年前

    你想用 %in% . 还要注意 c(27:503) 27:503 生成相同的对象。

    > yield[area %in% 27:503]
     [1]   2   3   4   5   7   8   9  10  12  13  14  15  17
    [14]  18  19  20  22  23  24  25  26  27  28  29  31  32
    [27]  33  34  36  37  38  39  41  42  43  44  46  47  48
    [40]  49  76  77  78  79  80  81  82  83  84  85  86  87
    [53]  88  89  90  91  92  93  94  95  96  97  98  99 100
    
        2
  •  1
  •   Brandon Bertelsen    14 年前

    为什么不使用子集?

    subset(yield, area > 26 & area < 504) ## for indexes
    subset(area, area > 26 & area < 504) ## for values