¡Hola a todos!

Tengo el siguiente data.frame:

p <-
data.frame(id=c(1:6),cara=c(1,0,0,1,0,0),anterior=c(0,1,2,0,4,5),siguiente=c(2,3,0,5,6,0),superficie=c(1,2,0,1,2,0))

En realidad es muchísimo más grande, pero creo que las primeras filas
servirán para explicar mi problema.

El data.frame contiene los puntos de intersección entre fotones y
superficies. Dichos puntos están identificados con el campo "id". Por otro
lado, el campo "siguiente" indica cual es el id de la siguiente
intersección. Mi problema es que necesito crear una nueva columna llamada,
por ejemplo, superficie_siguiente, que indique cual será la superficie de
la siguiente intersección. Cuando la "siguiente" es igual a 0 significa que
no hay nuevas intersecciones y se pondría en superficie_siguiente, por
ejemplo NA.

Lo he hecho con el siguiente bucle, pero es lentísimo.

surface_n <- function(p,p.s,n) {
  if(p[n,]$siguiente != 0) p.s[n,]$superficie_siguiente <-
p[p$id==p[n,]$siguiente,]$superficie
  return(p.s)
}

p.s <- cbind(p,superficie_siguiente = rep(NA,dim(p)[1]))

for(n in 1:dim(p)[1]) {
  p.s <- surface_n(p,p.s,n)
}

¿Alguna idea de cómo se puede hacer esto más rápido?

Gracias por adelantado,
Alberto.

	[[alternative HTML version deleted]]

