2013-07-25 100 views
1

所以有一個叫做train的數據框,和一個叫z的數字。 df火車包含一個名爲spread的列,我想選擇spread等於z的所有行。然後,如果總行數低於500,我想要選擇所有行擴展小於(z + 1)且大於(z-1)...的行,並且想要繼續此過程直至選擇500行。R數據幀切片?

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

到目前爲止,我所擁有的就是上面的,它會抓住我一些任意數量的行。要做我的方法,我會做一個循環。但想知道有沒有辦法做到這一點沒有循環?

回答

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 
+1

嗯 - 我想我比你的回答有點複雜。哈哈! – thelatemail

+0

r優雅imo的好例子 – appleLover

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) 

希望有所幫助。

+0

以上是我想到的,但@ agstudy的迴應更清晰,並且是您想要的一行。 –