1

我的数据如下所示:

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为自己的列,如果存在 a,则编码为 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)

但是,它不起作用,因为某些类别有多个实例。任何帮助,将不胜感激。谢谢!

4

2 回答 2

2

这很可能是重复的——您所做的通常被称为“一个热编码”。一种方法是利用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
于 2018-05-15T16:51:37.417 回答
0

另一种选择是tablebase 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
于 2018-05-16T03:40:34.190 回答