4

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

4

2 回答 2

7

一种简单的方法是创建一个分组变量,然后使用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 行的 a 示例,您的rep()语句应类似于:

rep(1:10, each=100)
于 2012-08-15T09:11:26.447 回答
1

@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], ] )
}
于 2012-08-15T17:00:05.647 回答