繁体   English   中英

聚合数据框

[英]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$n1df$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 ,因此n1n2values不同。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM