R 从分类变量创建新的虚拟变量列

R 从分类变量创建新的虚拟变量列,r,R,我有几个数据集,包含75000个观察值和一个值为0-4的type变量。我想为所有类型的每个数据集添加五个新的虚拟变量。我能想出的最好办法如下: # For the 'binom' data set create dummy variables for all types in all data sets binom.dummy.list<-list() for(i in 0:4){ binom.dummy.list[[i+1]]<-sapply(binom$type,func

我有几个数据集,包含75000个观察值和一个值为0-4的
type
变量。我想为所有类型的每个数据集添加五个新的虚拟变量。我能想出的最好办法如下:

# For the 'binom' data set create dummy variables for all types in all data sets
binom.dummy.list<-list()
for(i in 0:4){
    binom.dummy.list[[i+1]]<-sapply(binom$type,function(t) ifelse(t==i,1,0))
}

# Add and merge data
binom.dummy.df<-as.data.frame(do.call("cbind",binom.dummy.list))
binom.dummy.df<-transform(binom.dummy.df,id=1:nrow(binom))
binom<-merge(binom,binom.dummy.df,by="id")
#对于“binom”数据集,为所有数据集中的所有类型创建虚拟变量

binom.dummy.listDrew,这要快得多,不会造成任何崩溃

> binom <- data.frame(data=runif(1e5),type=sample(0:4,1e5,TRUE))
> for(t in unique(binom$type)) {
+   binom[paste("type",t,sep="")] <- ifelse(binom$type==t,1,0)
+ }
> head(binom)
        data type type2 type4 type1 type3 type0
1 0.11787309    2     1     0     0     0     0
2 0.11884046    4     0     1     0     0     0
3 0.92234950    4     0     1     0     0     0
4 0.44759259    1     0     0     1     0     0
5 0.01669651    2     1     0     0     0     0
6 0.33966184    3     0     0     0     1     0
>binom for(t为唯一(binom$type)){
+比诺姆[粘贴(“类型”,t,sep=“”)]头部(比诺姆)
数据类型type2 type4 type1 type3 type0
1 0.11787309    2     1     0     0     0     0
2 0.11884046    4     0     1     0     0     0
3 0.92234950    4     0     1     0     0     0
4 0.44759259    1     0     0     1     0     0
5 0.01669651    2     1     0     0     0     0
6 0.33966184    3     0     0     0     1     0

如果else
是矢量化的,因此如果我正确理解了您的代码,您就不需要使用
sapply
。而且我不会使用merge-我会使用SQLite或PostgreSQL


一些示例数据也会有所帮助:-)

使用model.matrix()怎么样

>binom头(binom)
数据类型
1 0.1412164    2
2 0.8764588    2
3 0.5559061    4
4 0.3890109    3
5 0.8725753    3
6 0.8358100    1
>inds负责人(inds)
因子(binom$类型)0因子(binom$类型)1因子(binom$类型)2因子(binom$类型)3因子(binom$类型)4
1                   0                   0                   1                   0                   0
2                   0                   0                   1                   0                   0
3                   0                   0                   0                   0                   1
4                   0                   0                   0                   1                   0
5                   0                   0                   0                   1                   0
6                   0                   1                   0                   0                   0
R有一个“子语言”将公式转换为设计矩阵,本着语言的精神,您可以利用它。它快速而简洁。例如:您有一个基数预测器x、一个分类预测器catVar和一个响应y

> binom <- data.frame(y=runif(1e5), x=runif(1e5), catVar=as.factor(sample(0:4,1e5,TRUE)))
> head(binom)
          y          x catVar
1 0.5051653 0.34888390      2
2 0.4868774 0.85005067      2
3 0.3324482 0.58467798      2
4 0.2966733 0.05510749      3
5 0.5695851 0.96237936      1
6 0.8358417 0.06367418      2
>binom头(binom)
y×catVar
1 0.5051653 0.34888390      2
2 0.4868774 0.85005067      2
3 0.3324482 0.58467798      2
4 0.2966733 0.05510749      3
5 0.5695851 0.96237936      1
6 0.8358417 0.06367418      2
你就是这样

> A <- model.matrix(y ~ x + catVar,binom) 
> head(A)
  (Intercept)          x catVar1 catVar2 catVar3 catVar4
1           1 0.34888390       0       1       0       0
2           1 0.85005067       0       1       0       0
3           1 0.58467798       0       1       0       0
4           1 0.05510749       0       0       1       0
5           1 0.96237936       1       0       0       0
6           1 0.06367418       0       1       0       0
>头部(A)
(截距)x catVar1 catVar2 catVar3 catVar4
1           1 0.34888390       0       1       0       0
2           1 0.85005067       0       1       0       0
3           1 0.58467798       0       1       0       0
4           1 0.05510749       0       0       1       0
5           1 0.96237936       1       0       0       0
6           1 0.06367418       0       1       0       0

完成。

如果您愿意使用该软件包,则有一个one\u hot()方法

哪些列应为一个热编码列?cols=“auto”对所有无序因子列进行编码。因此,下面的命令是等效的。这仅在data.table包含不应编码的因子时才重要

one_hot(binom, cols="catVar")

recipes包也可以非常强大地实现这一点。下面的示例非常详细,但只要添加更多预处理步骤,它就可以非常干净

library(recipes)

binom <- data.frame(y = runif(1e5), 
                    x = runif(1e5),
                    catVar = as.factor(sample(0:4, 1e5, TRUE))) # use the example from gappy
head(binom)

new_data <- recipe(y ~ ., data = binom) %>% 
  step_dummy(catVar) %>% # add dummy variable
  prep(training = binom) %>% # apply the preprocessing steps (could be more than just adding dummy variables)
  bake(newdata = binom) # apply the recipe to new data
head(new_data)
库(配方)
binom%#添加虚拟变量
prep(training=binom)%>%#应用预处理步骤(可能不仅仅是添加虚拟变量)
烘焙(newdata=binom)#将配方应用于新数据
总目(新数据)

其他step示例包括step_scale、step_center、step_pca等。

单层神经网络的nnet软件包(不了解因素)有一个转换命令:class.ind。

您可以使用名为
dummies的软件包。

binom <- data.frame(y=runif(1e5), x=runif(1e5), catVar=as.factor(sample(0:4,1e5,TRUE)))
head(binom)

          y          x catVar
1 0.4143348 0.09721401      1
2 0.3140782 0.54340539      3
3 0.1262037 0.51820499      2
4 0.7159850 0.13167720      3
5 0.8203528 0.94116026      3
6 0.2169781 0.82020216      1

binom任何简单的相反方向的方法,即你有虚拟变量,但想将它们折叠成一个变量?请注意,如果你改变使用的对比度类型,你会得到不同的结果。此外,对于有序因子和无序因子,你会得到不同的答案。在R中设置的默认对比度是
选项(对比度=c(“对照疗法”、“对照疗法”)
。请参阅《对比》
,以增加您的困惑。还要注意,这里的示例有5个类别,因为索引从0
样本开始(0:4,1e5,TRUE)
。我认为在base R中不可能自动生成所有级别的虚拟变量。这个特定的示例恰好省略了0的任何样本,这些样本将在模型矩阵中显示为一行零。这种方法会删除带有NAs的行,这使我更喜欢Joshua Ullrich的答案。为了澄清geneorama的观点,例如n le变量的级别您只需要n-1个虚拟变量来表示信息。(如果出于某种原因,您想要破解
model.matrix()
来显式表示所有列,您可以添加一个引用级别,而不包含任何成员,如
级别(binom$catVar)如果你不想截取,那么使用
一个好的解决方案。我可以建议,在“粘贴”之前加入一点“make.names”如果级别名称包含一些有争议的字符。如果类型变量也有NA值呢?除了1和0之外,我们如何将NA值作为单独的变量保留?将NA值编码为NA以外的其他值。
one_hot(binom, cols="catVar")
library(recipes)

binom <- data.frame(y = runif(1e5), 
                    x = runif(1e5),
                    catVar = as.factor(sample(0:4, 1e5, TRUE))) # use the example from gappy
head(binom)

new_data <- recipe(y ~ ., data = binom) %>% 
  step_dummy(catVar) %>% # add dummy variable
  prep(training = binom) %>% # apply the preprocessing steps (could be more than just adding dummy variables)
  bake(newdata = binom) # apply the recipe to new data
head(new_data)
binom <- data.frame(y=runif(1e5), x=runif(1e5), catVar=as.factor(sample(0:4,1e5,TRUE)))
head(binom)

          y          x catVar
1 0.4143348 0.09721401      1
2 0.3140782 0.54340539      3
3 0.1262037 0.51820499      2
4 0.7159850 0.13167720      3
5 0.8203528 0.94116026      3
6 0.2169781 0.82020216      1
library(dummies)
binom<-dummy.data.frame(binom)
head(binom)

          y          x catVar0 catVar1 catVar2 catVar3 catVar4
1 0.4143348 0.09721401       0       1       0       0       0
2 0.3140782 0.54340539       0       0       0       1       0
3 0.1262037 0.51820499       0       0       1       0       0
4 0.7159850 0.13167720       0       0       0       1       0
5 0.8203528 0.94116026       0       0       0       1       0
6 0.2169781 0.82020216       0       1       0       0       0