2014-11-30 6 views
1

Предположим, что у меня есть этот 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$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

df $ time - только обновленный мой исходный вопрос соответственно – user1701545

+0

Ваш вопрос сводится к тому, как «вырезать» значения времени. Пожалуйста, покажите точно, где вы ожидаете, что сокращения будут для разных значений среза. – Roland

ответ

2

Вы можете попробовать dplyr. Здесь values для n1 и 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)) 

и применения выше код дает

#  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 
+0

Что делать, если они хотят 'slice = 1.5'? – Roland

+0

@Roland Я обновился с 'seq'. Может быть, это работает? – akrun

+0

Я не уверен. Таким образом, мой комментарий к OP выше. – Roland

Смежные вопросы