R数据帧切片?

时间:2013-07-25 04:08:12

标签: r dataframe slice

所以有一个名为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 ),])

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

2 个答案:

答案 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)

希望有所帮助。