1

データを「行数」で分割したい。つまり、固定数の行を関数に送信したいのですが、データ フレームの最後 (最後のチャンク) に到達したら、固定数の行があるかどうかにかかわらず、チャンクを送信する必要があります。このようなもの:

ddply(df, .(8 rows), .fun=somefunction)
4

3 に答える 3

4

使用したい場合plyrは、カテゴリ列を追加できます。

df <- data.frame(x=rnorm(100), y=rnorm(100))

somefunction <- function(df) {
    data.frame(mean(df$x), mean(df$y))
}

df$category <- rep(letters[1:10], each=10)

ddply(df, .(category), somefunction)

ただし、この場合は apply ファミリの方が適している可能性があります。

somefunction <- function(n, x, y) {
    data.frame(mean(x[n:(n+9)]), mean(y[n:n+9]))
}

lapply(seq(1, nrow(df), by=10), somefunction, x=df$x, y=df$y)
于 2012-05-31T16:20:26.637 に答える
2

速度と簡潔さが重要な場合は、完全を期すために (例を短くするために、8 ではなく 4 のチャンク サイズを使用します):

require(data.table)
set.seed(0)
DT = data.table(a=rnorm(10))
DT
                 a
 [1,]  1.262954285
 [2,] -0.326233361
 [3,]  1.329799263
 [4,]  1.272429321
 [5,]  0.414641434
 [6,] -1.539950042
 [7,] -0.928567035
 [8,] -0.294720447
 [9,] -0.005767173
[10,]  2.404653389

DT[,list(sum=sum(a),groupsize=.N),by=list(chunk=(0:(nrow(DT)-1))%/%4)]
     chunk       sum groupsize
[1,]     0  3.538950         4
[2,]     1 -2.348596         4
[3,]     2  2.398886         2

確かに、それはかなり長い声明です。ただし、列に名前を付け、グループサイズも返し、最後のチャンクには必要に応じて 2 行しか含まれていないことを示しています。

正しいことをしていることに慣れたら、次のように短縮できます。

DT[,sum(a),by=list(chunk=(0:(nrow(DT)-1))%/%4)]
     chunk        V1
[1,]     0  3.538950
[2,]     1 -2.348596
[3,]     2  2.398886

そのような集計をオンザフライで実行できることに注意してください。最初にデータに追加する必要はありません。プロダクション スクリプトに多数の異なる集計がある場合、またはコマンド ラインからデータを操作したいだけの場合、ワークフローによっては、このような非常にわずかな生産性の違いが役立つことがあります。

NB: 私が選んだのはor (より可能性が高い)sumで置き換えることができますが、それぞれが列名を変数名と見なす任意の R 式です。somefunction(.SD)list(exp1,exp2,...)exp

于 2012-05-31T17:03:13.127 に答える
0

への呼び出し内で 8 行 ID を定義できますddply

特にエレガントではありませんが、使用していますddply(およびheadサンプル関数の場合)

df <- data.frame(x = rnorm(100), y = rnorm(100))
ddply(df, .(row_id = rep(seq(ceiling(nrow(df) / 8)), each = 8)[1:nrow(df)]),
             head, n = 1)
于 2012-06-01T00:24:55.313 に答える