如何创建一组虚拟变量来标识另一个变量中的特定值?
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 中选择值。
我想创建 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 中选择值。