【问题标题】:R Data Frame Slicing?R数据帧切片?
【发布时间】:2013-07-24 19:17:31
【问题描述】:

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

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

【问题讨论】:

    标签: r dataframe slice


    【解决方案1】:

    这是一种方法。使用lapply 避免循环。找出“flex”需要高于和低于zsubset 到该值的宽度。

    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)
    

    希望对您有所帮助。

    【讨论】:

    • 以上是我想到的,但@agstudy 的回复更简洁,是你想要的单行字。
    【解决方案2】:

    我认为应该这样做:

    head(train[order(abs(train$spread-z)),],500)
    

    取500个按spread和z之间的距离排序的第一个元素。这里的距离是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
    

    【讨论】:

    • 嗯-与您的回答相比,我想我有点复杂。哈哈!
    猜你喜欢
    • 2021-04-02
    • 2020-08-02
    • 2012-02-01
    • 1970-01-01
    • 2022-11-03
    • 2019-10-29
    • 2016-12-05
    • 2019-07-22
    • 2018-10-18
    相关资源
    最近更新 更多