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.

Creando una nueva columna con condiciones en adición al valor de fila de la nueva columna.

¿Alguna idea de cómo crear una nueva columna B utilizando los valores de la columna A, mientras se utiliza el valor de la fila anterior de la nueva columna B creada?

El valor de B debería corresponder a:

A0 = valor de la fila anterior.
A1 = 1.
A2 = valor de la fila anterior + 1.

Dataframe Actual + Resultado deseado

Dataframe Resultado deseado
A A B
1 1 1
0 0 1
2 2 2
0 0 2
2 2 3
0 0 3
2 2 4
0 0 4
2 2 5
0 0 5
2 2 6
0 0 6
1 1 1
0 0 1
1 1 1
0 0 1
2 2 2
0 0 2
2 2 3
0 0 3
1 1 1
0 0 1
2 2 2
0 0 2

DataFrame
A <- c(1,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,2,0,2,0,1,0,2,0)
Bresultado <- c(1,1,2,2,3,3,4,4,5,5,6,6,1,1,1,1,2,2,3,3,1,1,2,2)
df = data.frame(A,Bresultado)

He intentado usar dplyr, mutate(), case_when() y lag(), pero sigo encontrando errores debido al uso de la función lag(). Al utilizar lag(A) no se puede generar el resultado deseado. ¿Alguna idea de cómo resolver este problema?

df <- df%>%
      mutate(B = case_when((A == 0) ~ lag(B), 
                           (A == 1) ~ 1,
                           (A == 2) ~ (lag(B)+1)
)) 

Mensaje de error: UseMethod(“mutate”) : no hay un método aplicable para ‘mutate’ aplicado a un objeto de clase “función” Además: Warning message:

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema, puede crear primero un vector vacío B y luego usar un bucle for para iterar a través de cada fila del marco de datos, aplicando la lógica deseada para llenar el valor correspondiente de B. Aquí hay un ejemplo de fragmento de código que debería funcionar:

    “`{r}
    A <- c(1,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,2,0,2,0,1,0,2,0)
    n <- length(A) # número de filas en el marco de datos
    B <- vector(mode = “numeric”, length = n) # inicialice un vector vacío para B
    B[1] <- 1 # establezca el primer valor de B en 1

    for (i in 2:n) { # inicie el bucle desde la segunda fila
    if (A[i] == 0) {
    B[i] <- B[i-1] # si A es 0, establezca B en el valor de B de la fila anterior
    } else if (A[i] == 1) {
    B[i] <- 1 # si A es 1, establezca B en 1
    } else if (A[i] == 2) {
    B[i] <- B[i-1] + 1 # si A es 2, añada 1 al valor de B de la fila anterior
    }
    }

    df <- data.frame(A, Bresultadoesperado, B) # combine A, Bresultadoesperado y B en un marco de datos
    “`

    Esto debería darle el resultado deseado en la columna B del marco de datos df. ¡Hágamelo saber si tiene alguna pregunta o necesita más ayuda!

Comments are closed.