所以有一个名为train的数据帧和一个名为z的数字。 df列包含一个名为spread的列,我想选择扩展等于z的所有行。然后,如果总行数低于500,我想选择spread小于(z + 1)且大于(z-1)的所有行...并且想要继续此过程直到选择500行。
model<-glm(result~spread, data=train[(train$spread<z +3 & train$spread>z -3 ),])
到目前为止,我所拥有的只是上面的内容,它会抓住我一些任意数量的行。要做我的方法,我会循环。但是想知道有没有办法在没有循环的情况下做到这一点?
答案 0 :(得分:4)
我认为应该这样做:
head(train[order(abs(train$spread-z)),],500)
按照spread和z之间的距离排序第一个500元素。这里的距离为abs(x-y)
在20个元素的简短数据集中进行测试:
set.seed(1)
train <- data.frame(spread=sample(1:12,20,replace=TRUE),v=1:20)
z <- 5
##dist(cbind(spread,rep(z,length(spread))))
transform(train[order(abs(train$spread-z)),],dist=abs(spread-z))
spread v dist
2 5 2 0
14 5 14 0
19 5 19 0
1 4 1 1
16 6 16 1
3 7 3 2
5 3 5 2
11 3 11 2
12 3 12 2
8 8 8 3
9 8 9 3
10 1 10 4
13 9 13 4
17 9 17 4
15 10 15 5
20 10 20 5
4 11 4 6
6 11 6 6
7 12 7 7
18 12 18 7
答案 1 :(得分:0)
这是一种方法。使用lapply
来避免循环。找出“flex”的宽度需要高于和低于z
然后subset
到该值。
showNumRows <- function(flex) {
nrow(subset(train, spread>=z-flex & spread <= z+flex))
}
plus.minus.vec = c(0,1,2,3) #use more values if needed
rowvect <- lapply(plus.minus.vec, showNumRows) # gives you the num rows at each z+/- flex level
optimum.flex <- which(rowvect<500) # tells you the flex value at which you get more than 500 rows
#now use that flex value to get your 500+ rows subset of the df
subset(train, spread>=z-optimum.flex & spread <= z+optimum.flex)
希望有所帮助。