如何创建一组虚拟变量来标识另一个变量中的特定值?

How to create a group of dummy variables that identifies a specific value in another variable?

我想创建 dummies,它在 var "empresa" 中标识一个特定的企业。例如,创建一个新变量 "GLO",如果变量 "empresa" 的值为 "GLO",则该变量的值为 1,否则为 0。

数据结构如下:

head(tarifas)


    ano mes empresa origem destino tarifa assentos
1 2002   1     GLO   SBPA    SBBR 397,00       51
2 2002   1     AZU   SBSV    SBRF 272,00        5
3 2002   1     GLO   SBFL    SBGL 223,00      196
4 2002   1     TAM   SBGL    SBSP  96,00      615
5 2002   1     GLO   SBGL    SBRF 340,00      297
6 2002   1     AVI   SBSP    SBFL 145,00      189

我尝试同时使用 dplyr 和 for 循环,但出了点问题。 例如,要为企业 GLO 和 AZU 创建标识符,我使用了以下代码:

for (k in c("GLO", "AZU")) {
 tarifas2<- tarifas %>%
  mutate(paste0(k) = 0) %>%
  mutate(replace(paste0(k), empresa == paste0(",k,"),1))
}

我尝试使用以下代码:

tarifas<- cbind(tarifas,model.matrix( ~ 0 + empresa, tarifas))

但是当我处理大数据时,我遇到了内存问题,我不想为变量 "empresa" 中的每个不同观察创建一个虚拟变量,而是只为变量中的一些企业创建"empresa".

预期的输出类似于

        ano mes empresa origem destino tarifa assentos GLO AZU
1 2002   1     GLO   SBPA    SBBR 397,00       51      1   0
2 2002   1     AZU   SBSV    SBRF 272,00        5      0   1
3 2002   1     GLO   SBFL    SBGL 223,00      196      1   0
4 2002   1     TAM   SBGL    SBSP  96,00      615      0   0
5 2002   1     GLO   SBGL    SBRF 340,00      297      1   0
6 2002   1     AVI   SBSP    SBFL 145,00      189      0   0

提前致谢。

如果我们想在循环中创建新列

library(dplyr)
for (k in c("GLO", "AZU")) {
     tarifas  <- tarifas %>%
                    mutate(!! k := as.integer(empresa  ==  k))
   }


tarifas
#   ano mes empresa origem destino tarifa assentos GLO AZU
#1 2002   1     GLO   SBPA    SBBR 397,00       51   1   0
#2 2002   1     AZU   SBSV    SBRF 272,00        5   0   1
#3 2002   1     GLO   SBFL    SBGL 223,00      196   1   0
#4 2002   1     TAM   SBGL    SBSP  96,00      615   0   0
#5 2002   1     GLO   SBGL    SBRF 340,00      297   1   0
#6 2002   1     AVI   SBSP    SBFL 145,00      189   0   0

但是,我们也可以使用 pivot_wider

不使用循环来创建它
library(tidyr)
tarifas %>%
      mutate(rn = row_number(), val = 1) %>%
       pivot_wider(names_from = empresa, 
            values_from = val, values_fill = list(val = 0)))
# A tibble: 6 x 11
#    ano   mes origem destino tarifa assentos    rn   GLO   AZU   TAM   AVI
#  <int> <int> <chr>  <chr>   <chr>     <int> <int> <dbl> <dbl> <dbl> <dbl>
#1  2002     1 SBPA   SBBR    397,00       51     1     1     0     0     0
#2  2002     1 SBSV   SBRF    272,00        5     2     0     1     0     0
#3  2002     1 SBFL   SBGL    223,00      196     3     1     0     0     0
#4  2002     1 SBGL   SBSP    96,00       615     4     0     0     1     0
#5  2002     1 SBGL   SBRF    340,00      297     5     1     0     0     0
#6  2002     1 SBSP   SBFL    145,00      189     6     0     0     0     1

数据

tarifas <- structure(list(ano = c(2002L, 2002L, 2002L, 2002L, 2002L, 2002L
), mes = c(1L, 1L, 1L, 1L, 1L, 1L), empresa = c("GLO", "AZU", 
"GLO", "TAM", "GLO", "AVI"), origem = c("SBPA", "SBSV", "SBFL", 
"SBGL", "SBGL", "SBSP"), destino = c("SBBR", "SBRF", "SBGL", 
"SBSP", "SBRF", "SBFL"), tarifa = c("397,00", "272,00", "223,00", 
"96,00", "340,00", "145,00"), assentos = c(51L, 5L, 196L, 615L, 
297L, 189L)), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5", "6"))

另一种选择是dplyr::case_when()

tarifas <- tarifas %>%
  mutate(GLO = case_when(
    empresa == 'GLO' ~ 1,
    empresa != 'GLO' ~ 0),
    AZU = case_when(
      empresa == 'AZU' ~ 1,
      empresa != 'AZU' ~ 0)
    )

只需从您要为其创建列的 empresa 中选择值。