我的数据如下所示:
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)
但是,它不起作用,因为某些类别有多个实例。任何帮助,将不胜感激。谢谢!
答案 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