r: crea una nueva variable para todas las observaciones dentro de un grupo que sea igual a otro valor de variable condicionado a

CorePress2024-01-16  8

Tengo un marco de datos que se ve así:

cnpj tiempo2 n_act_contratos 12 -1 10 12 0 8 12 1 6 13 -1 3 13 0 5 13 1 7 14 1 3 14 2 5 14 3 7 15 N / A 3 15 N / A 5 15 N / A 7

Quiero definir otra variable que tome, para todas las observaciones que tengan el mismo cnpj, el valor de n_act_contracts cuando la variable time2 es igual a cero.

cnpj tiempo2 n_act_contratos contratos_cero_n_act_ 12 -1 10 8 12 0 8 8 12 1 6 8 13 -1 3 5 13 0 5 5 13 1 7 5 14 1 3 N / A 14 2 5 N / A 14 3 7 N / A 15 N / A 3 N / A 15 N / A 5 N / A 15 N / A 7 N / A

Lo he estado haciendo con las siguientes líneas de código, pero necesito hacerlo más eficiente.

data <- data %>%
group_by(cnpj) %>%
mutate(
zero_n_act_contracts = ifelse(time2 == 0,n_act_contracts,-1000),
zero_n_act_contracts = max(zero_n_act_contracts, na.rm = TRUE),
zero_n_act_contracts = ifelse(zero_n_act_contracts == -1000,NA,zero_n_act_contracts))

obs: Ya intenté reemplazar la base "ifelse" por dplyr: "if_else", bPero mi código tardó más en ejecutarse.



------------------------------------

Podemos utilizar

library(dplyr)
data %>% 
  group_by(cnpj) %>% 
  mutate(zero_n_act_contracts = n_act_contracts[time2 == 0][1]) %>%
  ungroup

-salida

# A tibble: 12 x 4
#    cnpj time2 n_act_contracts zero_n_act_contracts
#   <int> <int>           <int>                <int>
# 1    12    -1              10                    8
# 2    12     0               8                    8
# 3    12     1               6                    8
# 4    13    -1               3                    5
# 5    13     0               5                    5
# 6    13     1               7                    5
# 7    14     1               3                   NA
# 8    14     2               5                   NA
# 9    14     3               7                   NA
#10    15    NA               3                   NA
#11    15    NA               5                   NA
#12    15    NA               7                   NA
datos
df1 <- structure(list(cnpj = c(12L, 12L, 12L, 13L, 13L, 13L, 14L, 14L, 
14L, 15L, 15L, 15L), time2 = c(-1L, 0L, 1L, -1L, 0L, 1L, 1L, 
2L, 3L, NA, NA, NA), n_act_contracts = c(10L, 8L, 6L, 3L, 5L, 
7L, 3L, 5L, 7L, 3L, 5L, 7L)), class = "data.frame", row.names = c(NA, 
-12L))



------------------------------------

Una opción de tabla de datos

setDT(df)[,zero_n_act_contracts := n_act_contracts[!time2],cnpj]

da

> df
    cnpj time2 n_act_contracts zero_n_act_contracts
 1:   12    -1              10                    8
 2:   12     0               8                    8
 3:   12     1               6                    8
 4:   13    -1               3                    5
 5:   13     0               5                    5
 6:   13     1               7                    5
 7:   14     1               3                   NA
 8:   14     2               5                   NA
 9:   14     3               7                   NA
10:   15    NA               3                   NA
11:   15    NA               5                   NA
12:   15    NA               7                   NA

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare