我想通过“行数”打破了我的数据。 也就是说我要行的固定号码发送到我的功能,当我得到的数据帧的结束(最后一个块),我只是需要发送块是否具有行或更少的固定数量。 事情是这样的:
ddply(df, .(8 rows), .fun=somefunction)
我想通过“行数”打破了我的数据。 也就是说我要行的固定号码发送到我的功能,当我得到的数据帧的结束(最后一个块),我只是需要发送块是否具有行或更少的固定数量。 事情是这样的:
ddply(df, .(8 rows), .fun=somefunction)
如果你想使用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)
如果速度和简洁是感兴趣然后为了完整性(和使用的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的表达。
您可以在调用中定义的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)