Discussion:
[R-es] Manera eficiente de añadir el valor anterior por grupo
Jesús Para Fernández
2017-11-16 10:33:42 UTC
Permalink
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(y),x:=shift(y,1),by=grupo]

Pero no funciona.

Gracias!
Jesús

[[alternative HTML version deleted]]
Carlos Ortega
2017-11-16 12:33:04 UTC
Permalink
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(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



El 16 de noviembre de 2017, 11:33, Jesús Para Fernández <
***@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(y),x:=shift(y,1),by=grupo]
>
> Pero no funciona.
>
> Gracias!
> Jesús
>
> [[alternative HTML version deleted]]
>
>
> _______________________________________________
> R-help-es mailing list
> R-help-***@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>



--
Saludos,
Carlos Ortega
www.qualityexcellence.es

[[alternative HTML version deleted]]
Jesús Para Fernández
2017-11-16 12:55:45 UTC
Permalink
Gracias Carlos!!!

Obtener Outlook para Android<https://aka.ms/ghei36>

________________________________
From: Carlos Ortega <***@qualityexcellence.es>
Sent: Thursday, November 16, 2017 1:33:04 PM
To: Jesús Para Fernández
Cc: r-help-***@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 <***@hotmail.com<mailto:***@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-***@r-project.org<mailto:R-help-***@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]]
Jesús Para Fernández
2017-11-16 14:37:18 UTC
Permalink
Una duda sobre 1L, 0L...

He visto que se pone en data.table, ¿es para indicar que es un numero entero y obligar a que tenga ese formato? ¿por que no solo poner 1, 0... en vez de 1L,0L...?
________________________________
De: Carlos Ortega <***@qualityexcellence.es>
Enviado: jueves, 16 de noviembre de 2017 13:33
Para: Jesús Para Fernández
Cc: r-help-***@r-project.org
Asunto: 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 <***@hotmail.com<mailto:***@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-***@r-project.org<mailto:R-help-***@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]]
Carlos Ortega
2017-11-16 15:08:15 UTC
Permalink
Sírvete:

https://stackoverflow.com/questions/7014387/whats-the-difference-between-1l-and-1

Saludos,
Carlos Ortega
www.qualityexcellence.es


El 16 de noviembre de 2017, 15:37, Jesús Para Fernández <
***@hotmail.com> escribió:

> Una duda sobre 1L, 0L...
>
> He visto que se pone en data.table, ¿es para indicar que es un numero
> entero y obligar a que tenga ese formato? ¿por que no solo poner 1, 0... en
> vez de 1L,0L...?
> ------------------------------
> *De:* Carlos Ortega <***@qualityexcellence.es>
> *Enviado:* jueves, 16 de noviembre de 2017 13:33
> *Para:* Jesús Para Fernández
> *Cc:* r-help-***@r-project.org
> *Asunto:* 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 <
> ***@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-***@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>
>



--
Saludos,
Carlos Ortega
www.qualityexcellence.es

[[alternative HTML version deleted]]
Loading...