我有一个如下的数据框,

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 在这里,它只会为 BA 创建哑元,如下面的频率表所示。
> 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/

10-14 19:51
查看更多