使用subset()选择数据范围

时间:2016-03-25 22:31:42

标签: r

我是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

我无法找到我做错的事。

由于

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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