г эквивалент группы с кубом - PullRequest
2 голосов
/ 20 апреля 2011

Некоторые базы данных sql поддерживают модификатор with cube для group by операций.У меня нет этой функции.

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

+------+-----------+---------+---------+
| sum  | source_id | type_id | variety |
+------+-----------+---------+---------+
|  491 |         1 |       1 |       1 |
| 2008 |         1 |       2 |       1 |
|   33 |         1 |       3 |       1 |
|  483 |         1 |       4 |       1 |
|  482 |         1 |       5 |       1 |
|  343 |         1 |       6 |       1 |
| 4979 |         4 |       5 |       1 |
|  303 |         5 |       1 |       1 |
|  443 |         5 |       1 |       2 |
| 1295 |         5 |       2 |       1 |
...

Я хочу импортировать это в кадр данных в r и сгенерировать объединенную сумму для всех подгрупп-перестановки (source_id, type_id и разновидности).Итак, объединенная сумма где source_id = 1, где source_id = 1 и type_id = 1, где source_id = 1 и разновидность = 1, где type_id = 1 и разновидность = 1, где type_id = 1, где source_id = 2 и т. Д..

Как мне лучше всего это сделать?

Ответы [ 3 ]

4 голосов
/ 20 апреля 2011

Для этого вы можете использовать ddply и ввести список возможных комбинаций, например:

facs <- c("source_id","type_id","variety")

combs <-  unlist(
            mapply(function(j)combn(facs,j,simplify=F),1:3)
          ,recursive=F)

require(plyr)
datlist <- mapply(function(j)ddply(Data,j,summarize,sum(Sum)),combs)

require(reshape)
rbind.fill(datlist)

Проверено с:

Data <- data.frame(
  Sum=rpois(10,5),
  source_id=rep(1:2,each=5),
  type_id=rep(1:5,each=2),
  variety=rep(1:2,5)
)
2 голосов
/ 20 апреля 2011

Это должно сделать это

# generate dummy data

df = data.frame(
       Sum = rnorm(10), 
       source_id = sample(10, 5, replace = T), 
       type_id   = sample(10, 5, replace = T), 
       variety   = sample(10, 5, replace = T)
     )

index = names(df)[-1]
temp  = expand.grid(0:1, 0:1, 0:1)[-1,]

require(plyr)
cubedf = adply(temp, 1, function(x) 
   ddply(df, index[x == 1], summarize, SUM = sum(Sum)))

РЕДАКТИРОВАТЬ: АЛЬТЕРНАТИВНОЕ РЕШЕНИЕ (с использованием кода, заимствованного у Joris)

library(plyr)
# list factor variables
index  = names(df)[-1]

# generate all combinations of factor variables
combs  = unlist(llply(1:3, combn, x = index, simplify = F), recursive = F)

# calculate sum for each combination
cubedf = ldply(combs, function(var) 
            ddply(df, var, summarize, SUM = sum(Sum)))
1 голос
/ 20 апреля 2011

Ответ Джориса верен. Но я должен признать, что это не интуитивно для меня на первый взгляд. До прочтения его ответа я бы решил это за несколько шагов ddply(). Как то так:

Data <- data.frame(
  Sum=rpois(10,5),
  source_id=rep(1:2,each=5),
  type_id=rep(1:5,each=2),
  variety=rep(1:2,5)
)

require(plyr)

myStuff1 <- ddply(Data, c("source_id"                      ), function(df) sum(df$Sum) )
myStuff2 <- ddply(Data, c("source_id", "type_id"           ), function(df) sum(df$Sum) )
myStuff3 <- ddply(Data, c("source_id", "type_id", "variety"), function(df) sum(df$Sum) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...