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.

Agrupar_por, suma_condicional y reemplazar las variables en R.

Me gustaría convertir estas dos líneas de Stata en código R:

bysort sj hid: generate H = sum( d ) if f == 1 & ( d == 1 | d == 2 ) 
bysort sj hid: replace H = H[ _N ] if f == 1 & ( d == 1 | d == 2 )

Utilicé

H = ifelse(f == 1 & (d == 1 | d == 2), ave(d,sj,hid, FUN = sum),0)

Sin embargo, obtuve esto como resultado:

| sj  | hid   | f     | d     | H   |
|:---:|:-----:| -----:| -----:| ---:|
| 2000| 27    | 0     | 1     | 0   |
| 2000| 60    | 1     | 1     | 1   |
| 2000| 302   | 1     | 1     | 6   |
| 2000| 302   | 1     | 2     | 6   |
| 2000| 302   | 1     | 3     | 0   |

Me pregunto cómo puedo cambiar mi código en R para obtener H=3 en lugar de 6 en hid 302.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener H = 3 en lugar de 6 en la hid 302, debes modificar el código creando primero una nueva variable con la suma de d en cada grupo, y luego reemplazando el valor de H con el valor de esta nueva variable solo para la última observación dentro de cada grupo. Aquí está el código modificado:

    library(dplyr)
    
    df <- df %>% 
      group_by(sj, hid) %>% 
      mutate(H_temp = ifelse(f==1 & (d==1 | d==2), sum(d), 0), 
             H = ifelse(row_number() == n() & H_temp != 0, H_temp, H)) %>% 
      select(-H_temp)
    

    En este código, la función group_by() agrupa los datos por sj e hid, y la función mutate() crea una nueva variable H_temp con la suma de d dentro de cada grupo, pero solo para observaciones donde f es igual a 1 y d es igual a 1 o 2. La función ifelse() se utiliza para establecer el valor de H_temp igual a 0 para todas las demás observaciones.

    A continuación, la misma función mutate() modifica el valor de H reemplazándolo con el valor de H_temp solo para la última observación dentro de cada grupo (es decir, donde row_number() es igual a n(), el número de observaciones en el grupo). Sin embargo, esto solo se hace si H_temp no es igual a 0. Finalmente, la función select() elimina la variable H_temp del marco de datos.

    Esto debería darte el resultado deseado donde H = 3 para hid 302.

Comments are closed.