es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Copiando condicionalmente los valores de referencia en R

Estoy intentando copiar condicionalmente los valores de la columna x en una nueva columna basándome en un valor de referencia. Por ejemplo, en la fila 1, para time == 1, el valor de ref es 7, por lo que el valor de newx debe copiar el valor de x cuando time == 1 y id == 7. El valor copiado siempre debe estar dentro del mismo bloque de tiempo.

En caso de que el valor de ref sea 0, el valor de newx también debe ser 0.

He intentado algunos enfoques y lo siguiente es probablemente lo más cercano que he llegado, pero aún no funciona.

“`R
library(dplyr)
x <- sample(1:50, 24)
y <- sample(1:50, 24)
ref <- c(7,7,7,7,0,0,0,0,0,0,0,0,4,3,4,1,8,8,5,8,0,0,0,0)
id <- rep(seq(1,8,1), 3)
time <- rep(1:3, each = 8)

df <- as.data.frame(cbind(x,y,ref,id,time))

df <- df %>%
group_by(time) %>%
mutate(Newx = case_when((ref > 0) ~ x[which(id==ref)],
T ~ 0,))
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El código proporcionado parece estar mayormente correcto. Un problema que puedo ver es que la declaración which no está filtrando el grupo de tiempo correcto. Para asegurarse de que el valor copiado se mantenga dentro del mismo bloque de tiempo, la declaración which también debe especificar que time == current_time de la siguiente manera:

    df <- df %>% group_by(time) %>%
      mutate(Newx = case_when((ref > 0) ~ x[which(id==ref & time==current_time)],
                              T ~ 0,))
    

    Además, el valor current_time debe ser definido dentro de la declaración mutate. Esto se puede hacer utilizando la función cur_data() de dplyr:

    df <- df %>% group_by(time) %>%
      mutate(Newx = case_when((ref > 0) ~ x[which(id==ref & time==cur_data()$time)],
                              T ~ 0,))
    

    Después de hacer estos cambios, el código debería copiar correctamente los valores de la columna x a una nueva columna Newx basándose en el valor de referencia, teniendo en cuenta el grupo de tiempo y rellenando con 0 en los casos donde el valor de referencia es 0.

Comments are closed.