Преобразуйте категории в одном столбце в несколько столбцов, закодированных как 1 или 0, если они присутствуют или отсутствуют в R - PullRequest
0 голосов
/ 15 мая 2018

У меня есть данные, которые выглядят следующим образом:

library(dplyr)
library(tidyr)
a <- data_frame(type=c("A", "A", "B", "B", "C", "D"))
print(a)
# A tibble: 6 x 1
type 
<chr>
1 A    
2 A    
3 B    
4 B    
5 C    
6 D

Где type содержит категориальную информацию. Я пытаюсь преобразовать каждую категорию в type в ее собственный столбец, закодированный как 1, если присутствует type, и 0, если нет; Таким образом, конечный результат будет выглядеть так:

b <- data_frame(A=c(1, 1, 0, 0, 0, 0),
                B=c(0, 0, 1, 1, 0, 0),
                C=c(0, 0, 0, 0, 1, 0),
                D=c(0, 0, 0, 0, 0, 1))

   # A tibble: 6 x 4
     A     B     C     D
   <dbl> <dbl> <dbl> <dbl>
1    1.    0.    0.    0.
2    1.    0.    0.    0.
3    0.    1.    0.    0.
4    0.    1.    0.    0.
5    0.    0.    1.    0.
6    0.    0.    0.    1.

Я пробовал следующее:

a$dat <- 1
spread(a, type, dat)

Однако, это не работает, так как есть несколько экземпляров некоторых категорий. Любая помощь будет оценена. Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Другой вариант - table из base R

table(seq_len(nrow(a)), a$type)
#    A B C D
#  1 1 0 0 0
#  2 1 0 0 0
#  3 0 1 0 0
#  4 0 1 0 0
#  5 0 0 1 0
#  6 0 0 0 1
0 голосов
/ 15 мая 2018

Скорее всего, это дубликат - то, что вы делаете, обычно называют «одним горячим кодированием». Одним из способов является использование model.matrix:

library(tidyverse)

a %>% 
  model.matrix(~ . - 1, data = .) %>%
  as_data_frame()

# A tibble: 6 x 4
  typeA typeB typeC typeD
  <dbl> <dbl> <dbl> <dbl>
1     1     0     0     0
2     1     0     0     0
3     0     1     0     0
4     0     1     0     0
5     0     0     1     0
6     0     0     0     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...