Manipular dados em grupos e mesmo data frame

OI pessoal. Estou com uma base de dados imensa que quase estoura a memória do R e por isso, parafacilitar o entendimento de minha pergunta, suponha que a base de dados seja amtcars que existe no próprio R. Segue um pedaço dela abaixo.
mtcars
mpg cyl disp hp drat wt qsec vs am gear carb Mazda RX4 21.0 6 160.0 110 3.90 2.62016.46 0 1 4 4 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.87517.02 0 1 4 4 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.21519.44 1 0 3 1 Hornet Sportabout 18.7 8 360.0 175 3.15 3.44017.02 0 0 3 2 Valiant 18.1 6 225.0 105 2.76 3.46020.22 1 0 3 1 Duster 360 14.3 8 360.0 245 3.21 3.57015.84 0 0 3 4 Como faço para agrupar a variável gear em grupos 3, depoisde 4, etc, conforme a ordenação das variáveis cyl ( em 4,6,8,..) e VS ( em 0,1),ou seja, criar grupo da variável gear=3 onde a variáveis cyl e VS estejamordenadas, depois criar grupo da variável gear=4 com variáveis cyl e VS ordenadas,e assim por adiante....quero todos em uma mesma base de dados, ou seja, mesmodata frame. Peço isso a vocês, pois meu objetivo final é pegar variáveissempre que na linha i se tenha VS=1 e na linha i+2 cyl=2 com gear=4, e assimsucessivamente, ou seja, para cada grupo obtido para gear, intercruzar, VS=1 nalinha i e cyl=2 na linha i+2.Tentei usar o pacote dylpr e usar depois os comandos:selecao<-arrange(mtcars,cyl,VS,mpg, disp, hp,drat,wt,qsec,am,gear,carb) g<-group_by(selecao,cyl,vs,gear) conj<-filter(select(g,mpg,vs,cyl,gear),(vs==1 & lead(cyl,2)==4) | gear==4) Mas ele não separou por grupos, pois ao usar lead (lags parafrente) ele não fica restrito a cada grupo da variável formado com a gear, ouseja, o R desconsidera os grupos formados e não limita os “lags” para frente emapenas os grupos formados. Gente, se alguém puder ajudar, agradeço muito.

Edimeire, bom dia! Não sei se exatamente isso que você precisa, mas vou arriscar um palpite... ### <code r> require(dplyr) head(mtcars) df0 <- cbind(mtcars[,-c(10,8,2)], mtcars[,c(10,8,2)]); head(df0) # ordena pra facilitar df0$cyl.lag <- NA; head(df0) # Alternativa 1 ============================================================== # g1 <- split(df0, df0$gear); g1 # separa com split g2 <- lapply(g1, function(x) x[order(x$vs, x$cyl),]); g2 # ordena ### lead em g2 lapply(1:3, function(x) g2[[x]]$cyl.lag[g2[[x]]$vs==1] <<- lead(g2[[x]]$cyl[g2[[x]]$vs==1], 2)) # retorna data.frame df1 <- do.call(rbind, g2) df1[with(df1, which(vs==1 & cyl.lag==4)),] # mpg disp hp drat wt qsec am carb gear vs cyl cyl.lag # 4.Datsun 710 22.8 108.0 93 3.85 2.320 18.61 1 1 4 1 4 4 # 4.Merc 240D 24.4 146.7 62 3.69 3.190 20.00 0 2 4 1 4 4 # 4.Merc 230 22.8 140.8 95 3.92 3.150 22.90 0 2 4 1 4 4 # 4.Fiat 128 32.4 78.7 66 4.08 2.200 19.47 1 1 4 1 4 4 # 4.Honda Civic 30.4 75.7 52 4.93 1.615 18.52 1 2 4 1 4 4 # 4.Toyota Corolla 33.9 71.1 65 4.22 1.835 19.90 1 1 4 1 4 4 # Alternativa 2 ============================================================== # df2 <- with(df0, df0[order(gear, vs, cyl),]); head(df2) df2$cyl.lag <- NA; head(df) for (i in sort(unique(df2$gear))) { sel <- which(df2$gear==i & df2$vs==1) df2$cyl.lag[sel] <- lead(df2$cyl[sel], 2) } df2[with(df2, which(vs==1 & cyl.lag==4)),] # mpg disp hp drat wt qsec am carb gear vs cyl cyl.lag # Datsun 710 22.8 108.0 93 3.85 2.320 18.61 1 1 4 1 4 4 # Merc 240D 24.4 146.7 62 3.69 3.190 20.00 0 2 4 1 4 4 # Merc 230 22.8 140.8 95 3.92 3.150 22.90 0 2 4 1 4 4 # Fiat 128 32.4 78.7 66 4.08 2.200 19.47 1 1 4 1 4 4 # Honda Civic 30.4 75.7 52 4.93 1.615 18.52 1 2 4 1 4 4 # Toyota Corolla 33.9 71.1 65 4.22 1.835 19.90 1 1 4 1 4 4 ### </code> ================================================ Éder Comunello Researcher at Brazilian Agricultural Research Corporation (Embrapa) DSc in Agricultural Systems Engineering (USP/Esalq) MSc in Environ. Sciences (UEM), Agronomist (UEM) --- Embrapa Agropecuária Oeste, Dourados, MS, Brazil |<O>| ================================================ GEO, -22.2752, -54.8182, 408m UTC-04:00 / DST: UTC-03:00 Em 15 de junho de 2016 09:26, Edimeire Alexandra Pinto via R-br < r-br@listas.c3sl.ufpr.br> escreveu:
OI pessoal. Estou com uma base de dados imensa que quase estoura a memória do R e por isso, para facilitar o entendimento de minha pergunta, suponha que a base de dados seja a mtcars que existe no próprio R. Segue um pedaço dela abaixo.
mtcars mpg cyl disp hp drat wt qsec vs am gear carb Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Como faço para agrupar a variável gear em grupos 3, depois de 4, etc, conforme a ordenação das variáveis cyl ( em 4,6,8,..) e VS ( em 0,1), ou seja, criar grupo da variável gear=3 onde a variáveis cyl e VS estejam ordenadas, depois criar grupo da variável gear=4 com variáveis cyl e VS ordenadas, e assim por adiante....quero todos em uma mesma base de dados, ou seja, mesmo data frame.
Peço isso a vocês, pois meu objetivo final é pegar variáveis sempre que na linha i se tenha VS=1 e na linha i+2 cyl=2 com gear=4, e assim sucessivamente, ou seja, para cada grupo obtido para gear, intercruzar, VS=1 na linha i e cyl=2 na linha i+2. Tentei usar o pacote dylpr e usar depois os comandos: selecao<-arrange(mtcars, cyl,VS,mpg, disp, hp,drat,wt,qsec,am,gear,carb) g<-group_by(selecao, cyl,vs,gear) conj<-filter(select(g,mpg,vs,cyl,gear), (vs==1 & lead(cyl,2)==4) | gear==4)
Mas ele não separou por grupos, pois ao usar lead (lags para frente) ele não fica restrito a cada grupo da variável formado com a gear, ou seja, o R desconsidera os grupos formados e não limita os “lags” para frente em apenas os grupos formados.
Gente, se alguém puder ajudar, agradeço muito.
_______________________________________________ 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 (2)
-
Edimeire Alexandra Pinto
-
Éder Comunello