[R-es] Manera eficiente de añadir el valor anterior por grupo
Jesús Para Fernández
j.para.fernandez en hotmail.com
Jue Nov 16 13:55:45 CET 2017
Gracias Carlos!!!
Obtener Outlook para Android<https://aka.ms/ghei36>
________________________________
From: Carlos Ortega <cof en qualityexcellence.es>
Sent: Thursday, November 16, 2017 1:33:04 PM
To: Jesús Para Fernández
Cc: r-help-es en r-project.org
Subject: Re: [R-es] Manera eficiente de añadir el valor anterior por grupo
Hola,
Esta es una forma:
> library(data.table)
> datos<-data.table(grupo=rep(c("a","b"), each=5),x=c(1:10),y=rnorm(10,2,1))
>
> new_datos <- datos[, .SD[1:(.N+1)],by=grupo]
> # datos[, new_y:= shift(y,1), by=grupo]
>
> new_datos[, new_x := shift(y,1), by=grupo]
> new_datos[, x:= ifelse(is.na<https://eur02.safelinks.protection.outlook.com/?url=http%3A%2F%2Fis.na&data=02%7C01%7Cj.para.fernandez%40hotmail.com%7Ca00e675c854c4949def508d52cee32dd%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C636464323916834208&sdata=znykutMonHcdfngOxQF5bxhNeWMkoafEa%2BbT2EV18rw%3D&reserved=0>(x), 0L, x ), by=grupo]
> new_datos$x <- as.double(new_datos$x)
>
> new_datos[ ,x:= ifelse(x == 0, new_x, x), by=grupo]
> new_datos$new_x <- NULL
> new_datos
grupo x y
1: a 1.0000000 2.2626549
2: a 2.0000000 1.4232653
3: a 3.0000000 1.4361233
4: a 4.0000000 1.5171921
5: a 5.0000000 1.2444494
6: a 1.2444494 NA
7: b 6.0000000 2.1755191
8: b 7.0000000 3.7519007
9: b 8.0000000 3.5258307
10: b 9.0000000 2.8897186
11: b 10.0000000 0.9801489
12: b 0.9801489 NA
He tenido que hacer varias operaciones con las que no contaba, debido al tipo de la columna "x".
Saludos,
Carlos Ortega
www.qualityexcellence.es<https://eur02.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.qualityexcellence.es&data=02%7C01%7Cj.para.fernandez%40hotmail.com%7Ca00e675c854c4949def508d52cee32dd%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C636464323916834208&sdata=XheKo2c6OF75qPU8y680nuuj2W9pNr%2F7GGMysXYJ9%2Bc%3D&reserved=0>
El 16 de noviembre de 2017, 11:33, Jesús Para Fernández <j.para.fernandez en hotmail.com<mailto:j.para.fernandez en hotmail.com>> escribió:
Buenas
Tengo un Data table de la siguiente manera:
datos<-data.table(grupo=rep(c("a","b"),5),x=c(1:10),y=rnorm(10,2,1))
Lo que quiero es añadir una fila por cada grupo y en esa nueva fila, al valor de la x ponerle el valor anterior de la y
Lo que hago es añadir una nueva fila por grupo, con:
datos[,.SD[1:(.N+1)],by=grupo]
Y para añadir el valor anterior uso la función shift, pero lo estoy haciendo sacando en que filas de las x hay NA y cogiendo el valor anterior, pero todo casero.
¿HAy algguna manera eficiente de hacerlo en data.table?
He probado con:
datos[is.na<https://eur02.safelinks.protection.outlook.com/?url=http%3A%2F%2Fis.na&data=02%7C01%7Cj.para.fernandez%40hotmail.com%7Ca00e675c854c4949def508d52cee32dd%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C636464323916834208&sdata=znykutMonHcdfngOxQF5bxhNeWMkoafEa%2BbT2EV18rw%3D&reserved=0>(y),x:=shift(y,1),by=grupo]
Pero no funciona.
Gracias!
Jesús
[[alternative HTML version deleted]]
_______________________________________________
R-help-es mailing list
R-help-es en r-project.org<mailto:R-help-es en r-project.org>
https://stat.ethz.ch/mailman/listinfo/r-help-es<https://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstat.ethz.ch%2Fmailman%2Flistinfo%2Fr-help-es&data=02%7C01%7Cj.para.fernandez%40hotmail.com%7Ca00e675c854c4949def508d52cee32dd%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C636464323916834208&sdata=Sl86lkdEaJeuBDAF31CpCXVr3BTXzAkm9QXiOBBI9MU%3D&reserved=0>
--
Saludos,
Carlos Ortega
www.qualityexcellence.es<https://eur02.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.qualityexcellence.es&data=02%7C01%7Cj.para.fernandez%40hotmail.com%7Ca00e675c854c4949def508d52cee32dd%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C636464323916834208&sdata=XheKo2c6OF75qPU8y680nuuj2W9pNr%2F7GGMysXYJ9%2Bc%3D&reserved=0>
[[alternative HTML version deleted]]
Más información sobre la lista de distribución R-help-es