聚合数据框

时间:2014-11-30 14:51:33

标签: r dataframe aggregate

假设我有这个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.2秒)。

我正在寻找一个给定时间片值的有效函数 - 因此分组值为df$time,将通过求和df$n1df$n2来相应地聚合df。 (实际上这些列上升到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

1 个答案:

答案 0 :(得分:2)

您可以尝试dplyr。在此,valuesn1的{​​{1}}不同,因为没有n2

set.seed

或使用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))