2016-03-25 4 views
-1

Я новичок в функциях R, всегда предпочитаю использовать пакеты и избегать циклов. Однако теперь я пытаюсь создать цикл для конкретного вопроса, который у меня есть. Я хотел бы подмножить набор данных, основанный на диапазонах. Я думаю, что приведенный ниже код является самоочевидным.Использование подмножества() для выбора диапазонов данных

dt = as.data.frame(sample(1:100)) 
names(dt) = "num" 

subs.it <- function(x) { 
    subs <- subset(dt, num >= (x - 5) & num <= (x + 5)) 
    return(subs) 
} 
subs.it(c(15, 50)) 

неправильный выход:

num 
44 55 
47 20 
65 19 
77 17 
83 12 
91 16 
92 51 
100 54 

правильно:

num 
4 15 
18 11 
47 20 
50 13 
54 10 
65 19 
66 14 
77 17 
82 18 
83 12 
91 16 
17 48 
19 53 
29 45 
33 52 
39 46 
44 55 
45 50 
49 49 
89 47 
92 51 
100 54 

Я не могу найти то, что я делаю неправильно.

Благодаря

+0

Вы по существу запрашиваете все 'x> = c (10,45) & x <= c (20,55)', что просто бессмысленно с точки зрения R. Возможно, вы имеете в виду наличие двух условий, к которым присоединяется «или», например '(x> = ... & x <= ...) | (x> = ... & x <= ...) '? – joran

+0

Что вы предлагаете делать? – klo

+0

для подмножества набора данных на основе диапазонов. У меня будет более одного номера. Например, когда число от 15 до подмножества от 10 до 20 и число от 50 до подмножества от 45 до 55. Окончательный набор данных должен иметь диапазоны чисел от 10 до 20 и от 45 до 55. – klo

ответ

0

Похоже, что функции вы ищете subset сам. Попробуйте:

subset(dt, num > 15 & num <50)

редактировать:

ах я вижу, что вы хотите два различных диапазона. Вы можете сделать это:

x = 15 y = 50 subset(dt, (num >= x-5 & num <= x+5) | (num >= y-5 & num <= y+5))

или более компактную версию с использованием абсолютных значений:

subset(dt, (abs(num - x) <= 5 | abs(num - y) <= 5))

+0

спасибо, но это делает работу. Мне нужны диапазоны чисел, основанные на условии выше. Поэтому мне нужно получить цифры от 10 до 20 и от 45 до 55. – klo

+0

О, я вижу ... Я обновил свой ответ. –

0

Здесь вы идете.

set.seed(12345) 

library(dplyr) 

subs.it <- function(x, y, z) { 
     subs <- x %>% filter(
     (num >= (y-5) & num <= (y+5)) | (num >= (z-5) & num <= (z+5)) 
        ) 
     return(subs) 
    } 


subs.it(dt, 15, 55) 

    num 
1 16 
2 14 
3 15 
4 55 
5 52 
6 17 
7 56 
8 13 
9 57 
10 54 
11 18 
12 53 
13 11 
14 58 
15 19 
16 10 
17 51 
18 60 
19 20 
20 50 
21 12 
22 59 
+0

Спасибо. В приведенном выше примере я показал только 2 числа (15, 50), но в моих реальных данных будет много больше, около 30 чисел. В принципе, я хочу подмножить набор данных из целого ряда значений. У меня есть определенные значения (например, 15, 20) и на основе тех, которые я хочу подмножать строки со значением +/- 5. – klo

+0

Так что добавьте дополнительные переменные функции, а не только y и z, возможно, aa, ab, ac .. ap и т.д. Сохраняйте добавление переменных соответственно. – InfiniteFlashChess

+0

Я не уверен, что вы можете создать цикл for, который будет добавлять фильтры диапазона диапазона, как вы просите. – InfiniteFlashChess

Смежные вопросы