[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