簡體   English   中英

將變量拆分為每個因子的新列變量

[英]Split variable into new column variable for each factor

使用 R 數據集 mtcars,我想為“cyl”變量的每個級別創建一個新的二進制變量。

例如,cyl 的值為 6、4 和 8。

我想要一個新數據集,其中變量“cyl_4”、“cyl_6”和“cyl_8”在每個數字出現時都等於 1。

我正在尋找為原始變量的每個級別創建一個新變量的解決方案。

有:

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

想:

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb cyl_4 cyl_6 cyl_8
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 0     1      0
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 0     1      0
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 1     0      0
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 0     1      0
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 0     0      1
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1 0     1      0

這是一個 tidyverse 解決方案: cyl列上的 pivot ,然后將 3 個結果列中的值替換為 0,其中它們是 NA,否則替換為 1。

library(dplyr)
library(tidyr)
library(tibble)

mtcars %>% 
  rownames_to_column(var = "model") %>% 
  pivot_wider(names_from = "cyl", 
              values_from = "cyl", 
              names_prefix = "cyl_", 
              names_sort = TRUE) %>% 
  mutate(across(starts_with("cyl"), ~ ifelse(is.na(.), 0, 1)))

結果(前 5 行):

# A tibble: 32 × 14
   model               mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb cyl_4 cyl_6 cyl_8
   <chr>             <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 Mazda RX4          21    160    110  3.9   2.62  16.5     0     1     4     4     0     1     0
 2 Mazda RX4 Wag      21    160    110  3.9   2.88  17.0     0     1     4     4     0     1     0
 3 Datsun 710         22.8  108     93  3.85  2.32  18.6     1     1     4     1     1     0     0
 4 Hornet 4 Drive     21.4  258    110  3.08  3.22  19.4     1     0     3     1     0     1     0
 5 Hornet Sportabout  18.7  360    175  3.15  3.44  17.0     0     0     3     2     0     0     1

您可以使用model.matrix()為分類變量創建設計矩陣。

cbind(mtcars, model.matrix(~ cyl - 1, transform(mtcars, cyl = as.factor(cyl))))

#                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb cyl4 cyl6 cyl8
# Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4    0    1    0
# Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4    0    1    0
# Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1    1    0    0
# Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1    0    1    0
# Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2    0    0    1
# Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1    0    1    0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM