В R: индексирование векторов путем логического сравнения значения в диапазоне: index == c (min: max) - PullRequest
7 голосов
/ 17 ноября 2010

В 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 ]

6 голосов
/ 17 ноября 2010

Вы хотите использовать %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
1 голос
/ 18 ноября 2010

Почему бы не использовать подмножество?

subset(yield, area > 26 & area < 504) ## for indexes
subset(area, area > 26 & area < 504) ## for values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...