[英]Aggregating a data frame
假设我有这个data.frame:
df <- data.frame(time = seq(0.2,4,0.2), behavior = c(rep(0,4),rep(1,4),rep(2,4),rep(0,4),rep(1,4)), n1 = rnorm(20), n2 = rnorm(20))
df$time
是时间片(当前时间片= 0.2s)。
我正在寻找给定时间片值的有效函数-因此分组值是df$time
,将通过相加df$n1
, df$n2
来对df$n1
进行汇总(实际上,这些列最多为df$n200
因此我正在寻找通用的东西),并保持df$behavior
的最大值。
例如,如果时间片= 1.0,则结果data.frame
应为:
time behavior n1 n2
1 1 1 0.6995929 1.5603166
2 2 2 1.8677778 0.1046646
3 3 2 -1.5957459 -5.5116914
4 4 1 -1.0757102 1.5130076
您可以尝试dplyr
。 由于没有set.seed
,因此n1
和n2
的values
不同。
library(dplyr)
seq1 <- with(df, seq(floor(min(time)), ceiling(max(time)+1), by=1))
grp <- group_by(df, time=cut(time, breaks=seq1, labels=FALSE))
df1 <- grp %>%
summarise_each(funs(sum), n1:n2)
df2 <- grp %>%
summarise(behavior=max(behavior))
left_join(df2,df1, by='time')
# time behavior n1 n2
#1 1 1 0.8960162 0.6767968
#2 2 2 -2.2237071 -4.2431708
#3 3 2 -2.0750859 -3.7181187
#4 4 1 1.0824854 -0.2501264
或使用data.table
library(data.table)
setDT(df)[, c(behavior1=max(behavior),lapply(.SD, sum)),
by=list(time=cut(time, breaks=seq1, labels=FALSE))][,behavior:=NULL][]
如果需要减1.5
seq1 <- with(df, seq(floor(min(time)), ceiling(max(time)+1), by= 1.5)
grp <- group_by(df, time=cut(time, breaks=seq1))
并应用上面的代码给出
# time behavior n1 n2
#1 (0,1.5] 1 2.821384 2.981740
#2 (1.5,3] 2 1.145459 5.962142
#3 (3,4.5] 1 3.313462 2.236264
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.