2012-08-15 101 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)