2015-06-19 4 views
4

Моего набора данных что-то вроде этогоСводных данных по равноотстоящим временным интервалам R

Section Time x 
s3  9:35 2 
s4  9:35 2 
s1  9:36 1 
s2  10:01 1 
s8  11:00 2 

Итак, я хочу, чтобы сгруппировать секции данных мудр на часовом интервале и суммировать значения х, что лежит в этом интервале

Мой ожидается выход

sec  Time   x 
s1  9:00-10:00 1 
s2  9:00-10:00 0 
s3  9:00-10:00 2 
s4  9:00-10:00 2 
s8  9:00-10:00 0 
s1  10.00-11.00 0 
s2  10.00-11.00 1 
s3  10.00-11.00 0 
s4  10.00-11.00 0 
s8  10.00-11.00 1 

Я попытался получить некоторую помощь от этой должности in stack overflow, но я получаю следующее сообщение об ошибке для моего этого запроса. Здесь x - мой кадр

data.frame(value = tapply(cbind(x$x), 
        list(sec= x$section,cut(x$Time, breaks="1 hour")), 
         sum)) 

Error in cut.default(x$Time, breaks = "1 hour") : 'x' must be numeric 

Я даже не уверен, правильно это или нет. Я никогда не работал со временными данными в R. Таким образом, любая помощь в том, как я могу достичь этого, будет большой помощью.

+0

Просто чтобы убедиться: 's1' так же, как' S1'? –

ответ

5

Я думаю, проблема в том, что ваш столбец Time в формате символов?

Во всяком случае, вот быстрый и грязный подход с использованием dplyr:

library(dplyr) 
x <- data.frame(section = c("s3", "s4", "s1", "s2", "s8", "s1", "s2", "s3"), 
      Time = c("9:35", "9:35", "9:36", "10:01", "11:00", "9:45", "10:05", "10:05"), 
      x = c(2, 2, 1, 1, 2, 6, 2, 4), stringsAsFactors = FALSE) 
x %>% 
    rowwise %>% 
    mutate(aux = as.numeric(strsplit(Time, ":")[[1]][1]), 
     time = paste0(aux, ":00-", aux+1, ":00")) %>% 
    select(-aux, -Time) %>% 
    ungroup %>% 
    group_by(time, section) %>% 
    summarise(x = sum(x)) %>% 
    ungroup 
+0

Спасибо. вы были правы, проблема была в столбце Time. Я сделал что-то подобное в начале параметров сессии (stringsAsFactors = FALSE). Кроме того, вы можете объяснить мне этот код, пожалуйста, чтобы я мог реализовать его сам в будущем. Кроме того, если есть способ сделать это с базой R? – user3050590

+0

Я думаю, что у вас будет лучшее понимание, если вы посмотрите на виньетки dplyr, начиная с [Введение] (http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html), но Я в основном цепочки операций с использованием оператора труб ('%>%'). Сначала я считаю свои данные.frame x, то я говорю ему, чтобы выполнять будущие операции над каждой строкой, тогда я говорю, чтобы добавить два новых столбца (aux и time), затем я удаляю столбцы aux и time, а затем удаляю группировку, выполненную с помощью rollise, затем я группирую по времени и разделу и сумме x по каждой из этих групп. – Tutuchan

+0

Для решения базового R см. Ответ от @RHertel – Tutuchan

2

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

m1 <- as.data.frame(matrix(c("s3","9:35",2,"s4","9:35",2,"s1","9:36",1,"s2","10:01",1,"s8","11:00",2),byrow=T,ncol=3)) 
colnames(m1) <- c("Section", "Time","x") 
times <- as.character(m1$Time) 
hours <- sapply(sapply(times,function(x)strsplit(x,":")),function(x)x[1]) 
small_hours <- hours[which(as.numeric(hours)<10)] 
small_hours <- sapply(small_hours,function(x) paste0("0",x)) 
hours[which(as.numeric(hours)<10)]<-small_hours 
hour_range <- sapply(hours,function(x) paste0(x,":00-",as.character(as.numeric(x)+1),":00")) 
m1$Time <- hour_range 
m1$x <- as.numeric(m1$x) 
require (plyr) 
m1 <- ddply(m1, .(Time,Section), summarise, x = sum(x)) 
m1 <- m1[,c("Section","Time","x")] 

Это дает следующий кадр данных:

> m1 
    Section  Time x 
1  s1 09:00-10:00 1 
2  s3 09:00-10:00 2 
3  s4 09:00-10:00 2 
4  s2 10:00-11:00 1 
5  s8 11:00-12:00 2 

Трюк здесь, как и в предложении @ Tutuchan, игнорировать то, что времена на самом деле похожи на времена POSIXc t, но рассматривать их вместо этого просто как строки символов. Надеюсь, это поможет.

Update/Edit

Как я уже говорил ранее в комментариях, моя бывшая версия коды не выполнить требуемую сумму й над равными секциями, в том же сроки. Это исправлено в обновленной версии, опубликованной выше, но я решил отказаться от попытки сделать все это в базе R. В конце концов, я использовал пакет plyr.

1

Другие варианты используют класс POSIXct, а затем в функции cut, примененной к объектам даты, укажите «час» в аргументе breaks. См ?cut.POSIXt:

library(dplyr) 
df <- data.frame(section= c("s3", "s4", "s1", "s2", "s8"), 
       time = strptime(c("09:35", "09:35", "09:36", "10:01", "11:00"), "%H:%M"), 
       x = c(2, 2, 1, 1, 2)) 
df2 <- df %>% 
    group_by(intervals = cut(time, breaks = "hour")) %>% 
    select(section, intervals, x) 
df2$intervals <- format(as.POSIXct(df2$intervals, "%H:%M"), "%H:%M") 

Выход:

>df2 
Source: local data frame [5 x 3] 
Groups: intervals 

    section intervals x 
1  s3  09:00 2 
2  s4  09:00 2 
3  s1  09:00 1 
4  s2  10:00 1 
5  s8  11:00 2 
Смежные вопросы