4

1000行のデータフレームがあり、一度に100行の操作を実行したいと思います。だから、私は行数のカウンター増分をどのように使用し、1から100、次に101から200... 1000までのように一度に100行を選択し、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.frame1000行のaの例を使用すると、rep()ステートメントは次のようになります。

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

@mrdwab からの回答は素晴らしく、for ループを回避する方法を示しています。ただし、本当に for ループを使用する必要がある場合 (biglm パッケージは、使用したい場合の 1 つの例です)、1 つの方法を次に示します。

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 に答える