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.

Cómo agregar una nueva columna en un marco de datos de R que muestre la suma de un valor en una fila actual y una fila anterior, si se cumplen ciertas condiciones en las 2 filas.

Supongamos que tienes un marco de datos con las columnas “a” y “b” con los valores mostrados a continuación, generados con df <- data.frame(a=c(0, 1, 2, 2, 3), b=c(1, 3, 8, 9, 4)). Supongamos que quieres agregar una columna “c”, en la cual, si el valor en “a” es igual al valor en la fila inmediatamente anterior en la columna “a”, entonces se suman los valores correspondientes de la columna “b”; de lo contrario, se muestra un valor de 0. A continuación se agrega una columna “c” para ilustrar lo que intento hacer:

   a  b   add col c
1  0  1       0
2  1  3       0
3  2  8       0
4  2  9       17 (ya que los valores en las filas 3 y 4 de la columna "a" son iguales, se suman los valores en las filas 3 y 4 de la columna "b")
5  3  4       0

O en este escenario, donde las columnas “a” y “b” son generadas por df <- data.frame(a=c(0,1,2,2,2,3), b=c(1,2,3,4,5,6)):

   a  b    add col c
1  0  1        0
2  1  2        0
3  2  3        0
4  2  4        7 (3+4 de la columna "b")
5  2  5        9 (4+5 de la columna "b")
6  3  6        0 (ya que 2 de la fila anterior <> 3 de la fila actual)

¿Cuál es la manera más fácil de hacer esto en R nativo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La forma más sencilla de hacer esto en R nativo sería utilizar la función ifelse y la función lag del paquete dplyr. Aquí tienes un código de ejemplo que se puede utilizar en el primer escenario:

    library(dplyr)
    
    df <- data.frame(a=c(0, 1, 2, 2, 3), b=c(1, 3, 8, 9, 4))
    
    df$c <- ifelse(lag(df$a) == df$a, lag(df$b) + df$b, 0)
    

    Y aquí tienes un código de ejemplo que se puede utilizar en el segundo escenario:

    library(dplyr)
    
    df <- data.frame(a=c(0,1,2,2,2,3), b=c(1,2,3,4,5,6))
    
    df$c <- ifelse(lag(df$a) == df$a, lag(df$b) + df$b, 0)
    

    En ambos escenarios, el código primero verifica si el valor anterior de a es igual al valor actual de a. Si lo es, el código suma el valor anterior de b con el valor actual de b. Si no lo es, el código asigna un valor de 0 a la nueva columna c. La función lag se utiliza para obtener el valor anterior de a y b.

Comments are closed.