具有固定数目的行ddply(ddply with fixed number of rows)

2019-06-25 00:32发布

我想通过“行数”打破了我的数据。 也就是说我要行的固定号码发送到我的功能,当我得到的数据帧的结束(最后一个块),我只是需要发送块是否具有行或更少的固定数量。 事情是这样的:

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

Answer 1:

如果你想使用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)

但是,在申请家庭可能是在这种情况下一个更好的选择:

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)


Answer 2:

如果速度和简洁是感兴趣然后为了完整性(和使用的4而不是8块大小,以保持例如短):

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

Admitedly,这是相当长的一段陈述。 它的名字列,并返回该组的大小过于向您展示的最后一块确实只包括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

请注意,您可以实时聚合这样做; 他们并不需要先添加到数据。 如果你有很多不同的聚合的生产脚本,或者只是想用命令行中的数据交互,那么像这样的非常小的生产率差异有时可以帮助,这取决于你的工作流程。

注:我挑sum ,但可能会被替换somefunction(.SD)或(更可能)只是list(exp1,exp2,...)其中每个exp是看到列名作为变量名的任何R的表达。



Answer 3:

您可以在调用中定义的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)


文章来源: ddply with fixed number of rows
标签: r plyr