#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, поэтому, я думаю, это должно было быть более очевидным для меня.