[R-br] Manipular dados em grupos e mesmo data frame

Éder Comunello comunello.eder em gmail.com
Quinta Junho 16 09:37:08 BRT 2016


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 em 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 em 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.
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20160616/f98fd16f/attachment.html>


Mais detalhes sobre a lista de discussão R-br