
Caros, rotineiramente me deparo com um problema que não sei como resolver. Considerem o seguinte exemplo: (c1 <- trunc(runif(1000,1,10))) (c2 <- trunc(runif(1000,5,70))) (c3 <- trunc(runif(1000,1,4))) (var <- rnorm(1000,10,2)) (peso <- round(rnorm(1000,1,.2)^2,1)) df <- data.frame(c1,c2,c3,var,peso) Gostaria de uma função que pudesse me fornecer em uma única tabela do tipo cols = c1,c2,c3,count,medvar e, mais genericamente, cols = c1,c2,c3,somapeso,medpondvar com todas as combinações existentes (as vezes todas as teoricamente possiveis) entre c1,c2,c3 c1 c2 c3 c1*c2 c1*c3 c2*c3 c1*c2*c3 De forma mais específica, gostaria: t1 <- aggregate(list(count = df$var), list(c1=rep('*tot',1000) ,c2=rep('*tot',1000),c3=rep('*tot',1000)),length) tc1 <- aggregate(list(count = df$var), list(c1=df$c1 ,c2=rep('*tot',1000),c3=rep('*tot',1000)),length) tc2 <- aggregate(list(count = df$var), list(c1=rep('*tot',1000),c2=df$c2 ,c3=rep('*tot',1000)),length) tc3 <- aggregate(list(count = df$var), list(c1=rep('*tot',1000),c2=rep('*tot',1000),c3=df$c3 ),length) tc1c2 <- aggregate(list(count = df$var), list(c1=df$c1 ,c2=df$c2 ,c3=rep('*tot',1000)),length) tc1c3 <- aggregate(list(count = df$var), list(c1=df$c1 ,c2=rep('*tot',1000),c3=df$c3 ),length) tc2c3 <- aggregate(list(count = df$var), list(c1=rep('*tot',1000),c2=df$c2 ,c3=df$c3 ),length) tc1c2c3 <- aggregate(list(count = df$var), list(c1=df$c1 ,c2=df$c2 ,c3=df$c3),length) comp1 <- rbind(t1,tc1,tc2,tc3,tc1c2,tc1c3,tc2c3,tc1c2c3) rm(t1,tc1,tc2,tc3,tc1c2,tc1c3,tc2c3,tc1c2c3) t1 <- aggregate(list(medvar = df$var), list(c1=rep('*tot',1000) ,c2=rep('*tot',1000),c3=rep('*tot',1000)),mean) tc1 <- aggregate(list(medvar = df$var), list(c1=df$c1 ,c2=rep('*tot',1000),c3=rep('*tot',1000)),mean) tc2 <- aggregate(list(medvar = df$var), list(c1=rep('*tot',1000),c2=df$c2 ,c3=rep('*tot',1000)),mean) tc3 <- aggregate(list(medvar = df$var), list(c1=rep('*tot',1000),c2=rep('*tot',1000),c3=df$c3 ),mean) tc1c2 <- aggregate(list(medvar = df$var), list(c1=df$c1 ,c2=df$c2 ,c3=rep('*tot',1000)),mean) tc1c3 <- aggregate(list(medvar = df$var), list(c1=df$c1 ,c2=rep('*tot',1000),c3=df$c3 ),mean) tc2c3 <- aggregate(list(medvar = df$var), list(c1=rep('*tot',1000),c2=df$c2 ,c3=df$c3 ),mean) tc1c2c3 <- aggregate(list(medvar = df$var), list(c1=df$c1 ,c2=df$c2 ,c3=df$c3),mean) comp2 <- rbind(t1,tc1,tc2,tc3,tc1c2,tc1c3,tc2c3,tc1c2c3) rm(tc1,tc2,tc3,tc1c2,tc1c3,tc2c3,tc1c2c3) comp <- merge(comp1,comp2,by=c('c1','c2','c3'),all=T) rm(comp1,comp2) Exite algum pacote que faca isso?

Partindo do data.frame que você forneceu no seu CMR. Alias, parábens por enviá-lo e ilustrar tão bem suas necessidades. Segue minha primeira abordagem para solucionar o problema. df <- data.frame(c1, c2, c3, var, peso) str(df) ## Lista de fórmulas. f <- c( var~c1, var~c2, var~c3, var~c1+c2, var~c1+c3, var~c2+c3, var~c1+c2+c3) aggregate(f[[1]], data=df, FUN=mean) L <- lapply(f, function(fi){ a <- aggregate(fi, data=df, FUN=mean) b <- aggregate(fi, data=df, FUN=length) m <- merge(a, b, by=names(a)[-ncol(a)]) names(m)[ncol(m)-1:0] <- c("mean", "length") return(m) }) str(L) require(plyr) M <- do.call(rbind.fill, L) str(M) ## À fazer: ## 1) tocar colunas de lugar, fatores antes, respostas depois. ## 2) trocar NA por tot. ## 3) talvez reordenar linhas. ## 4) encontrar uma forma automática de gerar todas as formulas a partir ## dos termos passados para ganhar tempo. Foi usado que a aggregate() aceita fórmulas, a lapply() varre as fórmulas, dentro ocorre a agregação seguida de merge(), depois o "deslistamento" usando a rbind.fill() para empilhar data.frame que não tem o mesmo nome/número de colunas. À disposição. Walmes.

Leandro, Não tenho certeza se entendi certo o seu problema. Se for pra fazer uma tabela empilhada de diversas variáveis (na linhas) po ruma única variável nas colunas, então a função é epicalc::tableStack Abraço, Dr. Pedro Emmanuel A. A. do Brasil http://blog.ipec.fiocruz.br/lapclin-chagas/ Curriculum Lattes: http://lattes.cnpq.br/6597654894290806 ResearchGate.net: https://www.researchgate.net/profile/Pedro_Brasil2/ Instituto Nacional de Infectologia/Instituto de Pesquisa Clínica Evandro Chagas Fundação Oswaldo Cruz Rio de Janeiro - Brasil Av. Brasil 4365, CEP 21040-360, Tel 55 21 3865-9648 e-mail: pedro.brasil@ipec.fiocruz.br e-mail: emmanuel.brasil@gmail.com Em 31 de julho de 2014 12:00, Leandro Marino < leandromarino@leandromarino.com.br> escreveu:
Caros,
rotineiramente me deparo com um problema que não sei como resolver. Considerem o seguinte exemplo:
(c1 <- trunc(runif(1000,1,10))) (c2 <- trunc(runif(1000,5,70))) (c3 <- trunc(runif(1000,1,4))) (var <- rnorm(1000,10,2)) (peso <- round(rnorm(1000,1,.2)^2,1)) df <- data.frame(c1,c2,c3,var,peso)
Gostaria de uma função que pudesse me fornecer em uma única tabela do tipo cols = c1,c2,c3,count,medvar e, mais genericamente, cols = c1,c2,c3,somapeso,medpondvar
com todas as combinações existentes (as vezes todas as teoricamente possiveis) entre c1,c2,c3 c1 c2 c3 c1*c2 c1*c3 c2*c3 c1*c2*c3
De forma mais específica, gostaria:
t1 <- aggregate(list(count = df$var), list(c1=rep('*tot',1000) ,c2=rep('*tot',1000),c3=rep('*tot',1000)),length) tc1 <- aggregate(list(count = df$var), list(c1=df$c1 ,c2=rep('*tot',1000),c3=rep('*tot',1000)),length) tc2 <- aggregate(list(count = df$var), list(c1=rep('*tot',1000),c2=df$c2 ,c3=rep('*tot',1000)),length) tc3 <- aggregate(list(count = df$var), list(c1=rep('*tot',1000),c2=rep('*tot',1000),c3=df$c3 ),length) tc1c2 <- aggregate(list(count = df$var), list(c1=df$c1 ,c2=df$c2 ,c3=rep('*tot',1000)),length) tc1c3 <- aggregate(list(count = df$var), list(c1=df$c1 ,c2=rep('*tot',1000),c3=df$c3 ),length) tc2c3 <- aggregate(list(count = df$var), list(c1=rep('*tot',1000),c2=df$c2 ,c3=df$c3 ),length) tc1c2c3 <- aggregate(list(count = df$var), list(c1=df$c1 ,c2=df$c2 ,c3=df$c3),length) comp1 <- rbind(t1,tc1,tc2,tc3,tc1c2,tc1c3,tc2c3,tc1c2c3) rm(t1,tc1,tc2,tc3,tc1c2,tc1c3,tc2c3,tc1c2c3)
t1 <- aggregate(list(medvar = df$var), list(c1=rep('*tot',1000) ,c2=rep('*tot',1000),c3=rep('*tot',1000)),mean) tc1 <- aggregate(list(medvar = df$var), list(c1=df$c1 ,c2=rep('*tot',1000),c3=rep('*tot',1000)),mean) tc2 <- aggregate(list(medvar = df$var), list(c1=rep('*tot',1000),c2=df$c2 ,c3=rep('*tot',1000)),mean) tc3 <- aggregate(list(medvar = df$var), list(c1=rep('*tot',1000),c2=rep('*tot',1000),c3=df$c3 ),mean) tc1c2 <- aggregate(list(medvar = df$var), list(c1=df$c1 ,c2=df$c2 ,c3=rep('*tot',1000)),mean) tc1c3 <- aggregate(list(medvar = df$var), list(c1=df$c1 ,c2=rep('*tot',1000),c3=df$c3 ),mean) tc2c3 <- aggregate(list(medvar = df$var), list(c1=rep('*tot',1000),c2=df$c2 ,c3=df$c3 ),mean) tc1c2c3 <- aggregate(list(medvar = df$var), list(c1=df$c1 ,c2=df$c2 ,c3=df$c3),mean) comp2 <- rbind(t1,tc1,tc2,tc3,tc1c2,tc1c3,tc2c3,tc1c2c3) rm(tc1,tc2,tc3,tc1c2,tc1c3,tc2c3,tc1c2c3)
comp <- merge(comp1,comp2,by=c('c1','c2','c3'),all=T) rm(comp1,comp2)
Exite algum pacote que faca isso?
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
participantes (3)
-
Leandro Marino
-
Pedro Emmanuel Alvarenga Americano do Brasil
-
walmes .