假设我有这个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$n1
,df$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
答案 0 :(得分:2)
您可以尝试dplyr
。在此,values
和n1
的{{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))