2015-02-01 3 views
1

У меня есть кадр данных с 12511 строками и 16 столбцами, полученными из эксперимента с животными. Каждая строка, представляющая количество операций, подсчитывается каждую минуту для каждого животного. Я хотел бы суммировать столбцы на каждой 60-й строке (это количество в час).Подсчет столбцов на каждую n-ю строку кадра данных в R

Я пытался использовать применить функцию суммирования 60 строк:

apply(rw[1:60,],2,sum) 
apply(rw[61:120,],2,sum) 
apply(rw[121:180,],2,sum) 

... держать делать это, пока 12511 немыслим и отнимает много времени.

Я уверен, что есть разумный способ сконденсировать мои данные на 208 строк. Пожалуйста помоги!!

спасибо.

+2

12511 не делится поровну на 60 –

ответ

4

Вот подход, использующий data.table пакет и векторизованную colSums функцию

Некоторые данные первого:

set.seed(123) 
rw <- data.frame(a = sample(12511), b = sample(12511), c = sample(12511)) 

Затем мы создавать и индексировать с использованием gl и запускать colSums за группу

library(data.table) 
setDT(rw)[, as.list(colSums(.SD)), by = gl(ceiling(12511/60), 60, 12511)] 
#  gl  a  b  c 
# 1: 1 378678 387703 388143 
# 2: 2 384532 331275 341092 
# 3: 3 355397 367039 369012 
# 4: 4 378483 355384 367988 
# 5: 5 365193 372779 388020 
# ---       
# 205: 205 385361 409004 389946 
# 206: 206 407232 406940 345496 
# 207: 207 363253 357317 356878 
# 208: 208 387336 383786 348978 
# 209: 209 186874 188616 183500 

Другой подобный подход был бы

setDT(rw)[, lapply(.SD, sum), by = gl(ceiling(12511/60), 60, 12511)] 

Или с помощью dplyr сек summarise_each функции, точно так же может сделать

library(dplyr) 
rw %>% 
    group_by(indx = gl(ceiling(12511/60), 60, 12511)) %>% 
    summarise_each(funs(sum)) 
# Source: local data table [209 x 4] 
# 
# indx  a  b  c 
# 1  1 378678 387703 388143 
# 2  2 384532 331275 341092 
# 3  3 355397 367039 369012 
# 4  4 378483 355384 367988 
# 5  5 365193 372779 388020 
# 6  6 387260 386737 347777 
# 7  7 343980 412633 383429 
# 8  8 355059 352393 336798 
# 9  9 372722 386863 425622 
# 10 10 406628 370606 362041 
# .. ... ... ... ... 
+0

Мне нравится индекс с использованием 'gl()' и 'ceiling()'. Решение касается неравного размера группы. +1! Для подхода 'dplyr' я придумал' group_by (id = gl (потолок (nrow (.)/60), 60, nrow (.))) 'В случае, если его ввод данных не всегда * 12511 –

+0

Большое спасибо, я не заметил, что первый код от @RStudent игнорирует некоторые мои данные. Но я просто попытался использовать ваш код для вычисления полных данных, но не понял, что (---) в out put? Как я могу сделать данные видимыми :) – henok

+0

Сохраните результат где-нибудь, а затем используйте 'View' на нем. –

0

Вот моя версия, использующая данные Дэвида Arenburg в:

set.seed(123) 
rw <- data.frame(a = sample(12511), b = sample(12511), c = sample(12511)) 

ind <- c(rep(60, floor(dim(rw)[1]/60)), floor(dim(rw)[1]%%60)) 
ind <- rep(1:length(ind), times = ind) 
head(apply(rw, 2, function(x) tapply(x, ind, sum))) 
     a  b  c 
1 378678 387703 388143 
2 384532 331275 341092 
3 355397 367039 369012 
4 378483 355384 367988 
5 365193 372779 388020 
6 387260 386737 347777 
Смежные вопросы