1

したがって、train と呼ばれるデータフレームと、z と呼ばれる数値があります。dfトレインにはスプレッドという列が含まれており、スプレッドが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)

スプレッドと 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

これを行う1つの方法を次に示します。lapplyループを回避するために使用します。「フレックス」が上下に必要な幅を調べて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 に答える