2014-09-14 4 views
2

У меня есть данные, которые упорядочены таким образом, что день/месяц/год в отдельных столбцах (что полезно для того, как мне нужно подмножество данных). Каждый столбец, кроме D/M/Y, является столбцами значений. По моим реальным данным, это уезды в СШАPlyr/data.table подмножество

Мне нужно суммировать разные диапазоны дат, которые варьируются в зависимости от разных комбинаций день, месяц и год. Учитывая, что каждый столбец является графством, функции ddply/data.table/apply кажутся наиболее подходящими для решения проблемы. Однако я не могу понять, как подмножить мои данные.

Вот тривиальный пример:

set.seed(1234) 

data <- data.frame(day=rep(seq(1,5),9), month= rep(c(rep(1,5),rep(2,5),rep(11,5)),3), 
        year=c(rep(1999,15),rep(2000,15),rep(2001,15)), Abel = round(runif(n=45, 0, 5),2) , 
        Bertha=round(runif(n=45, 0, 5),2), Charlie= round(runif(n=45,0, 5),2)) 

dt <- data.table(data) 
keycols <- c("day", "month", "year") 
setkeyv(dt, keycols) #not sure if this is necessary 

Первоначально я думал, используя ddply команду() с опцией подвести итог, но видели и другие случаи, когда люди рекомендовали использовать data.table рамки. Тем не менее, я не могу понять способ подмножества данных таким образом, чтобы получить его, чтобы соответствовать результаты следующим образом:

sum(data$Abel[which(data$year==1999 & data$month==2 & data$day >=1 & data$day <4)]) #4.41 
sum(data$Bertha[which(data$year==1999 & data$month==2 & data$day >=1 & data$day <4)]) #5.51 
sum(data$Charlie[which(data$year==1999 & data$month==2 & data$day >=1 & data$day <4)]) #4.19 

Хотя этот пример может показаться легким, я должен вычислить 10-дневные средние климата данные для сотен графств в течение десятилетий, поэтому получение рамок ddply/data.table для работы действительно поможет!

Я попытался как data.table и ddply, но и с ошибками:

dt[i=list(year==1999, month==2, day >=1, day<3), sum] 
#Error in `[.data.table`(dt, i = list(year == 1999, month == 2, day >= : 
# typeof x.day (integer) != typeof i.day (logical) 

Я понимаю, что это значит, что я делаю что-то неправильно с настройкой data.table, но я гавань» t использовал его раньше и просмотрел несколько файлов справки и не может понять проблемы подмножества.

Для ddply, я получаю другую ошибку, когда я просто пытаюсь использовать одну особую колонку, чтобы попытаться заставить его работать:

ddply(data, .(year, month, day, Abel), summarize, sum.val = sum) 
#Error in vector(type, length) : 
# vector: cannot make a vector of mode 'builtin'. 

Любое руководство по решению проблем подобного рода было бы весьма признателен!

+0

Что именно вы хотите суммировать по переменным группировки? –

+0

Результаты от 'sum' expessions неправильные не? –

+0

@PauloCardoso: каждый столбец представляет данные о осадках для этого округа, поэтому я хотел бы суммировать это для разных диапазонов дня/месяца/года, которые будут меняться. Имеет ли это смысл? Или мне нужно уточнить? – Tony

ответ

3

Я думаю, что вы близки с data.table, вам просто нужно изменить, как вы используете i заявление.

dt[year==1999 & month==2 & between(day,0,2), lapply(.SD,sum), .SDcols=4:6] 

    Abel Bertha Charlie 
1: 3.25 1.92 4.06 

Вы также можете быть заинтересованы в использовании функции ISOdate, чтобы сделать его немного легче работать с вашими данными.

dt[ , Date := ISOdate(year, month, day)] 

От прочтения некоторых комментариев в другом ответе, кажется, что это могло бы быть более прокатным известково вопрос. Этот пакет https://github.com/mgahan/boRingTrees R может помочь вам в выполнении текущих сумм или средних или любых других.

+0

Это работает. Я ценю помощь при вычислении выражения 'i '. Я также проверю другие пакеты! – Tony

+3

Вы должны иметь возможность получать 10-дневные (катящиеся) средние с помощью 'rollmean' в пакете' zoo'. С вашими данными выше, я думаю, что это будет выглядеть как 'library (zoo); дт [, lapply (.sd, функция (х) {rollmean (х, к = 10)}) ,. SDcols = -c (1: 3)] '. – nrussell

+1

приятно добавить с рулоном! Спасибо за это. –

1

Попробуйте начать

library(reshape2) 
datam <- melt(data, id.vars = c('day', 'month', 'year'), 
       variable.name = "name") 
library(dplyr) 
datam %>% 
    filter(year==1999, month==2, day %in% 1:3) %>% 
    group_by(year, month, name) %>% 
    summarise(summed = sum(value)) 


Source: local data frame [3 x 4] 
Groups: year, month 

    year month name summed 
1 1999  2 Abel 4.41 
2 1999  2 Bertha 5.51 
3 1999  2 Charlie 4.19 
+0

Спасибо, я буду смотреть на этот код больше, но я пытаюсь получить что-то, что в конце будет суммировать: 'Abel 4.41', поскольку это суммарное значение для Abel for (d/m/y) 1/2/1999: (3.2) 2/2/1999: (0,05) и 3/2/1999: (1.16) – Tony

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