将一列中的类别转换为编码为 1 或 0 的多列(如果 R 中存在或不存在)
Convert categories in one column to multiple columns coded as 1 or 0 if present or absent in R
我的数据如下所示:
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)
但是,它不起作用,因为某些类别有多个实例。任何帮助,将不胜感激。谢谢!
这可能是重复的 -- 您所做的通常称为 "one hot encoding"。一种方法是利用 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
另一个选项是 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
我的数据如下所示:
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)
但是,它不起作用,因为某些类别有多个实例。任何帮助,将不胜感激。谢谢!
这可能是重复的 -- 您所做的通常称为 "one hot encoding"。一种方法是利用 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
另一个选项是 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