【问题标题】:Selecting a range of rows from R data frame从 R 数据框中选择一系列行
【发布时间】:2012-08-15 09:04:30
【问题描述】:

我有一个包含 1000 行的数据框,我想一次对其执行 100 行的操作。 因此,我试图找出如何在行数上使用计数器增量并一次选择 100 行,例如 1 到 100,然后选择 101 到 200 ......直到 1000 并使用 for 对每个子集执行操作环形。任何人都可以建议如何做到这一点,因为我找不到一个好的方法。

【问题讨论】:

    标签: r


    【解决方案1】:

    一种简单的方法是创建一个分组变量,然后使用split()lapply() 执行您需要的任何操作。

    您可以使用rep()轻松创建分组。

    这是一个例子:

    set.seed(1)
    demo = data.frame(A = sample(300, 50, replace=TRUE),
                      B = rnorm(50))
    demo$groups = rep(1:5, each=10)
    demo.split = split(demo, demo$groups)
    lapply(demo.split, colMeans)
    # $`1`
    #           A           B      groups 
    # 165.9000000  -0.1530186   1.0000000 
    # 
    # $`2`
    #           A           B      groups 
    # 168.2000000   0.1141589   2.0000000 
    # 
    # $`3`
    #           A           B      groups 
    # 126.0000000   0.1625241   3.0000000 
    # 
    # $`4`
    #           A           B      groups 
    # 159.4000000   0.3340555   4.0000000 
    # 
    # $`5`
    #           A           B      groups 
    # 181.8000000   0.0363812   5.0000000 
    

    如果您不想将组添加到您的源data.frame,您可以通过执行以下操作来实现相同的效果:

    groups = rep(1:5, each=10)
    lapply(split(demo, groups), colMeans)
    

    当然,将colMeans 替换为您想要的任何功能。

    使用您的 data.frame 示例(有 1000 行),您的 rep() 语句应该类似于:

    rep(1:10, each=100)
    

    【讨论】:

      【解决方案2】:

      @mrdwab 的答案很棒,它展示了如何避免 for 循环。但如果你真的必须使用 for 循环(biglm 包就是你可能想要的一个例子),那么这里有一种方法:

      for( i in seq(1,1000,by=100) ) {
        myfun( df[ i:(i+99), ] )
      }
      

      如果总行数不是块大小的倍数,那么您可能需要更多类似的东西:

      tmp <- seq( 1, nrow(df), by=100 )
      tmp2 <- c( tail( tmp, -1)-1, nrow(df) )
      n <- length(tmp)
      out <- numeric(n)
      for( i in seq_along(tmp) ) {
        out[i] <- myfun( df[ tmp[i]:tmp2[i], ] )
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多