2012-08-15 102 views
3

我有一个1000行的数据帧,我想对它一次执行100行操作。 因此,我试图找出如何使用行数的计数器增量,并选择100行,如1到100,然后101到200 ... uptil 1000,并使用每个子集执行操作for循环。任何人都可以请建议如何做到这一点,因为我找不到一个好方法。从R数据帧中选择一个范围的行

回答

0

答案从@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], ]) 
} 
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行的例子,你rep()的说法应该是这样的:

rep(1:10, each=100)