如果R中存在或不存在,则将一列中的类别转换为编码为1或0的多个列

时间:2018-05-15 16:46:02

标签: r dataframe reshape spread

我的数据如下所示:

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中的每个类别转换为自己的列,如果存在type则编码为1,否则为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 :(得分:2)

这可能是重复的 - 你正在做的事情通常被称为&#34;一个热编码&#34;。一种方法是利用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

答案 1 :(得分:0)

另一个选项是来自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