R. обобщение данных без слияния

#r #dataframe #plyr #summarization

#r #фрейм данных #plyr #обобщение

Вопрос:

У меня есть фрейм данных (df) с голами, забитыми против разных команд по дате

 gamedate teamID Gls
 1992-08-22  CHL  3
 1992-08-22  MNU  1
 1992-08-23  ARS  0
 1992-08-23  LIV  2
 1992-08-24  MNU  0
 1992-08-25  LIV  2
 1992-08-26  ARS  0
 1992-08-26  CHL  0
  

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

 gamedate   games blanks
 1992-08-22   2     0
 1992-08-23   2     1
 1992-08-24   1     1
 1992-08-25   1     0
 1992-08-26   2     2
  

Я могу получить игры и заготовки отдельно, используя ddply

 df.a <- ddply(df,"gamedate",function(x) c(count=nrow(x)))
df.b <- ddply(subset(df,Gls==0),"gamedate",function(x) c(count=nrow(x)))
  

а затем объедините df.a и df.b, чтобы получить мой ответ. Тем не менее, я уверен, что должно быть больше
простое и элегантное решение

Ответ №1:

Вам просто нужно использовать summarise :

Считайте данные в:

    dat <- read.table(textConnection("gamedate teamID Gls
  1992-08-22  CHL  3
  1992-08-22  MNU  1
  1992-08-23  ARS  0
  1992-08-23  LIV  2
  1992-08-24  MNU  0
  1992-08-25  LIV  2
  1992-08-26  ARS  0
  1992-08-26  CHL  0"),sep = "",header = TRUE)
  

и затем вызовите ddply :

 ddply(dat,.(gamedate),summarise,tot = length(teamID),blanks = length(which(Gls == 0)))
    gamedate tot blanks
1 1992-08-22   2      0
2 1992-08-23   2      1
3 1992-08-24   1      1
4 1992-08-25   1      0
5 1992-08-26   2      2
  

Комментарии:

1. Ранняя пташка и т.д. Спасибо за это.

Ответ №2:

Единственное, чего вам не хватает, это обертывания ваших функций в data.frame() вызове и присвоения им имен столбцов… и имена столбцов необязательны 🙂

Я использую @joran’s dat data.frame, поскольку это позволило мне проверить мой ответ.

 ddply( dat, "gamedate", function(x) data.frame( 
                                      tot = nrow( x ), 
                                      blanks = nrow( subset(x, Gls == 0 ) ) 
                                              ) 
     )
  

Кстати, мое забавное форматирование выше предназначено только для предотвращения прокрутки на экране и для иллюстрации того, как я на самом деле просто объединяю функции, которые вы уже создали.

Ответ №3:

Другое решение с использованием простого aggregate . Я использую joran dat .

 agg <- aggregate(cbind(1, dat$Gls==0), list(dat$gamedate), sum)
names(agg) <- c("gamedate", "games", "blanks")
agg
  

Комментарии:

1. 1 для агрегированного решения. Можете ли вы объяснить, что делает cbind(1, …)? Это просто действует как «счетчик»?

2. @DWin cbind добавляет столбец из 1, который затем он может суммировать, чтобы получить подсчет количества строк. Таким образом, оба значения являются суммированием.

3. хммм. Я делал подобные вещи с помощью tapply, поэтому, я думаю, это должно было быть более очевидным для меня.