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.
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:
En este código, la función
group_by()
agrupa los datos por sj e hid, y la funciónmutate()
crea una nueva variableH_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ónifelse()
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, donderow_number()
es igual an()
, 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ónselect()
elimina la variable H_temp del marco de datos.Esto debería darte el resultado deseado donde H = 3 para hid 302.