我是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 :(得分: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