1

所以有一个数据框叫做train,还有一个数字叫做z。df 列车包含一个名为 spread 的列,我想选择 spread 等于 z 的所有行。然后,如果总行数低于 500,我想选择散布小于 (z+1) 且大于 (z-1) 的所有行......并希望继续此过程,直到选择 500 行。

model<-glm(result~spread, data=train[(train$spread<z +3 & train$spread>z -3 ),])

到目前为止,我所拥有的就是上述内容,它将抓住我任意数量的行。要执行我的方法,我会循环执行。但是想知道有没有办法在没有循环的情况下做到这一点?

4

2 回答 2

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
于 2013-07-25T04:41:32.060 回答
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)

希望有帮助。

于 2013-07-25T05:08:43.823 回答