2016-05-20 3 views
0

У меня есть несколько наблюдений от разных лиц в разные даты, например.dplyr суммировать дату по будням

df <- data.frame(id= c(rep(1,5), rep(2,8), rep(3,7)), 
       dates = seq.Date(as.Date("2015-01-01"), by="month", length=20)) 

Здесь у нас есть 3 человека (id) с различным количеством наблюдений каждый.

Теперь я хочу рассчитать понедельники, дни и т. Д. Для каждого человека.

Это должно быть сделано с использованием dplyr и summarize, потому что у моего реального набора данных есть еще много столбцов, которые я суммирую с разными статистическими данными.

Это должна быть какая-то вроде этого:

summa <- df %>% group_by(id) %>% 
      summarize(mondays = #numberof mondays, 
        tuesdays = #number of tuesdays, 
         .........) 

Как это может быть достигнуто?

ответ

3

Вы можете использовать пакет lubridate:

library(lubridate) 

summa <- df %>% group_by(id) %>% 
    summarize(mondays = sum(wday(dates) == 2), 
    .... 
3

Я хотел бы сделать следующее:

summa <- count(df, id, day = weekdays(dates)) 

# or: 
# summa <- df %>% 
#  mutate(day = weekdays(dates)) %>% 
#  count(id, day) 

head(summa) 
#Source: local data frame [6 x 3] 
#Groups: id [2] 
# 
#  id  day  n 
# (dbl)  (chr) (int) 
#1  1 Donnerstag  1 
#2  1 Freitag  1 
#3  1 Mittwoch  1 
#4  1 Sonntag  2 
#5  2 Dienstag  2 
#6  2 Donnerstag  1 

Но вы также можете изменить в широком формате:

library(tidyr) 
spread(summa, day, n, fill=0) 
#Source: local data frame [3 x 8] 
#Groups: id [3] 
# 
#  id Dienstag Donnerstag Freitag Mittwoch Montag Samstag Sonntag 
# (dbl) (dbl)  (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) 
#1  1  0   1  1  1  0  0  2 
#2  2  2   1  1  1  1  1  1 
#3  3  1   0  2  1  2  0  1 

Мои результаты на немецком языке, но у вас будет в вашем родном языке, конечно. Имена столбцов - это рабочие дни в Германии.


Если вы хотите использовать summarize явно вы можете достичь того же, как описано выше, используя:

summa <- df %>% 
    group_by(id, day = weekdays(dates)) %>% 
    summarize(n = n()) # or do something with summarise_each() for many columns 
1

Base Дата функции:

summa <- df %>% group_by(id) %>% 
    summarise(monday = sum(weekdays(dates) == "Monday"), 
       tuesday = sum(weekdays(dates) == "Tuesday")) 
Смежные вопросы