我有一个如下的数据框,
library(janitor)
library(dplyr)
set.seed(100)
data <- data_frame(var = sample(c("A", "B", "C"), 20, replace = TRUE))
> data
# A tibble: 20 × 1
var
<chr>
1 A
2 A
3 B
4 A
5 B
6 B
7 C
8 B
9 B
10 A
11 B
12 C
13 A
14 B
15 C
16 C
17 A
18 B
19 B
20 C
我想创建 虚拟变量 对应于
var
的每个级别,但有一个问题:我想将虚拟对象 的创建仅限于 到
n
的顶级 var
级别。原因很简单:在我的数据集中, var
有成千上万个不同的级别。也就是说,如果
n = 2
在这里,它只会为 B
和 A
创建哑元,如下面的频率表所示。> janitor::tabyl(data,var , sort = TRUE)
var n percent
1 B 9 0.45
2 A 6 0.30
3 C 5 0.25
我怎样才能以最简洁的方式做到这一点?像往常一样,输出类似于
dummy_B dummy_A
0 1
0 1
1 0
0 1
等等。
谢谢!
最佳答案
阅读您的大数据问题后,这是我修改后的解决方案:
n <- 2 # set your n here
data1 <- data # I just did this step for testing; it's totally optional
data1$var[! data1$var %in% tabyl(data,var , sort = TRUE)$var[1:n]] <- NA
booya <- model.matrix(~var-1, data1)
head(booya)
请注意,您不需要创建数据对象的额外副本;我这样做只是为了我自己的目的。如果您不想弄乱原始
var
列,您可以创建一个新列或字符向量。这是我最初的尝试,不利于大数据:
n <- 2 # set your n here
tmp <- model.matrix(~var-1, data)
colnames(tmp) <- gsub("^[[:alpha:]]", "", colnames(tmp))
colnames(tmp) <- gsub("^[[:alpha:]]", "", colnames(tmp))
colnames(tmp) <- gsub("^[[:alpha:]]", "", colnames(tmp))
final <- tmp[, colnames(tmp)%in%tabyl(data,var , sort = TRUE)$var[1:n]]
head(final)
关于R:如何仅针对分类变量的顶级获取虚拟变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40620458/