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