从分类变量和NA变量在R中创建二进制变量

从分类变量和NA变量在R中创建二进制变量,r,binary,R,Binary,我有一个12901category和NA观测数据集,包含34个变量。我将使用该数据集通过对消费者人口统计数据进行聚类来创建市场细分研究 对于category变量,我想将其转换为numeric二进制数据。例如,可变户主收入有六类:50K-75k、75k-100k、35k-50K、100k-125k、150k-175k和其他。我想把家庭收入分成六个变量(0,0,0,0,0,1),(0,0,0,0,1,0),(0,0,0,0,1,0,0),(0,0,1,0,0,0),(0,1,0,0,0,0,0)和(

我有一个12901
category
NA
观测数据集,包含34个变量。我将使用该数据集通过对消费者人口统计数据进行聚类来创建市场细分研究

对于
category
变量,我想将其转换为
numeric
二进制数据。例如,可变
户主收入有六类:50K-75k、75k-100k、35k-50K、100k-125k、150k-175k和其他。我想把
家庭收入
分成六个变量(0,0,0,0,0,1),(0,0,0,0,1,0),(0,0,0,0,1,0,0),(0,0,1,0,0,0),(0,1,0,0,0,0,0)和(1,0,0,0,0,0,0,0)

问题:如何将分类值更改为二进制变量,同时保留
NA
s

我的机器:

> sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-apple-darwin13.1.0 (64-bit)
我的数据:

#Head of first six rows of the first six columns
> head(Store4df)
     Age Gender HouseholdIncome MaritalStatus PresenceofChildren HomeOwnerStatus
1  55-64 Female         50k-75k        Single                 No             Own
2   <NA> Female            <NA>          <NA>               <NA>            <NA>
3   <NA>   Male            <NA>          <NA>               <NA>            <NA>
4   <NA>   Male            <NA>          <NA>               <NA>            <NA>
5    65+   Male        75k-100k        Single                 No             Own
6   <NA> Female            <NA>          <NA>               <NA>            <NA>
编辑:我忘了发布我有两种类型的分类变量。一个具有类别和
NA
值,另一个具有
TRUE
NA
值。我在将带有
TRUE
NA
值的变量放入
model.matrix
时出错

> model.matrix(~ -1 + . , data = Store4df)
#Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrasts can be applied only to factors with 2 or more levels

如何在第10列和第12:34列中替换真实值

对于解决方法,我要做的是将
替换为“不可用”(或其他内容)。然后,
也将被视为因子级别

copy <-Store4df
levels(copy$HomeMarketValue) <- c(levels(copy$HomeMarketValue),"Not Available")
copy$HomeMarketValue[is.na(copy$HomeMarketValue)]<-"Not Available"
binary1 <- model.matrix(~ factor(copy$HomeMarketValue) - 1)

copy对于解决方案,我要做的是将
替换为“不可用”(或其他内容)。然后,
也将被视为因子级别

copy <-Store4df
levels(copy$HomeMarketValue) <- c(levels(copy$HomeMarketValue),"Not Available")
copy$HomeMarketValue[is.na(copy$HomeMarketValue)]<-"Not Available"
binary1 <- model.matrix(~ factor(copy$HomeMarketValue) - 1)

copy我不认为
model.matrix
可以使用参数来详细说明如何处理缺少的数据,但是,您可以将默认选项更改为
na.pass
,从而在
model.matrix
调用中保留缺少的值

# create data with missing values
set.seed(1)
dat <- data.frame(x=sample(letters[1:3],20,TRUE), y=rnorm(20), 
                                                  stringsAsFactors=FALSE)
dat[c(5,10,15),1] <- NA

# set default options for handling missing data
options(na.action='na.pass')

# note that rows with missing data are retained
m <- model.matrix(~ -1 + x + y, data=dat)

# return option to default
options(na.action='na.omit')
#创建缺少值的数据
种子(1)

dat我不认为
model.matrix
可以使用参数来详细说明如何处理缺失数据,但是,您可以将默认选项更改为
na.pass
,从而在
model.matrix
调用中保留缺失的值

# create data with missing values
set.seed(1)
dat <- data.frame(x=sample(letters[1:3],20,TRUE), y=rnorm(20), 
                                                  stringsAsFactors=FALSE)
dat[c(5,10,15),1] <- NA

# set default options for handling missing data
options(na.action='na.pass')

# note that rows with missing data are retained
m <- model.matrix(~ -1 + x + y, data=dat)

# return option to default
options(na.action='na.omit')
#创建缺少值的数据
种子(1)

dat使用
插入符号
包可以轻松完成此操作。
下面的代码是一种快速的方法,可以一次完成任意数量的变量

require(caret)
# Make sure variables you are using are factors

VARS.TO.MAKE.DUMMY <-  #list of variables to convert to dummy
    c("HouseholdIncome", "Age")

dat.temp <- # Temporary data.frame to make dummies
    Store4df[,VARS.TO.MAKE.DUMMY]

dummy.vars <- # create dummies  
    predict(  
        dummyVars(  
            ~ .,   
            data = dat.temp
            ),
        newdata = dat.temp,
        na.action = na.pass
        )

Store4df <- # Append results to original dataframe
    cbind(Store4df, as.data.frame(dummy.vars))

rm(dummy.vars, dat.temp) # Garbage collection
require(插入符号)
#确保您使用的变量是因子

VARS.TO.MAKE.DUMMY这可以使用
插入符号
包轻松完成。
下面的代码是一种快速的方法,可以一次完成任意数量的变量

require(caret)
# Make sure variables you are using are factors

VARS.TO.MAKE.DUMMY <-  #list of variables to convert to dummy
    c("HouseholdIncome", "Age")

dat.temp <- # Temporary data.frame to make dummies
    Store4df[,VARS.TO.MAKE.DUMMY]

dummy.vars <- # create dummies  
    predict(  
        dummyVars(  
            ~ .,   
            data = dat.temp
            ),
        newdata = dat.temp,
        na.action = na.pass
        )

Store4df <- # Append results to original dataframe
    cbind(Store4df, as.data.frame(dummy.vars))

rm(dummy.vars, dat.temp) # Garbage collection
require(插入符号)
#确保您使用的变量是因子


你为什么需要这个?之后你打算如何处理这些数据?R通常倾向于将分类数据保留为因子形式,而不是伪变量形式,然后根据需要应用对比度。@MrFlick我将使用CLUSTER软件包中的CLARA函数使用这些数据执行聚类分析。我尝试使用PAM,但无法预先创建数据集部分填充率的差异度量b/c。我现在改用一种数字算法,它只需要一个样本,而不是计算每次观测的距离。你为什么需要这个?之后你打算如何处理这些数据?R通常倾向于将分类数据保留为因子形式,而不是伪变量形式,然后根据需要应用对比度。@MrFlick我将使用CLUSTER软件包中的CLARA函数使用这些数据执行聚类分析。我尝试使用PAM,但无法预先创建数据集部分填充率的差异度量b/c。我正在切换到一种数值算法,该算法只采集一个样本,而不是计算每一次观测的距离。@Griebe先生,我在解决方案的第二行出现了一个错误,警告消息是:在
[使用“levels”添加因子级别“NotAvailable”@mrgriebe回顾这个解决方案,我不认为把NA变成一个变量是一个好主意。我认为所有分类观察都应该有自己的列,但保留NA值。我们怎么做呢?我将使用数据集进行聚类,CLARA将计算从一个缺失的反对到另一个的距离。创建示例,CLARA将为medoid分配一个NA值。我编辑了我的帖子,以展示数据集的使用。正如我所说,这是一个解决办法。我认为它仍然回答了你的问题。你是对的,数据集中仍然有NA值。但是,我正在计算距离,只要每对观测数据至少缺少一个案例,没关系。我还没有看到任何数据挖掘者将NAs转换为二进制变量。在某些情况下,将NA作为因子级别可能很有用,但我们需要在每个因子中使用NAs。@Griebe先生,我在解决方案的第二行上得到一个错误,警告消息是:在
[使用“级别”添加因子级别“NotAvailable”@mrgriebe回顾这个解决方案,我不认为把NA变成一个变量是一个好主意。我认为所有分类观察都应该有自己的列,但保留NA值。我们怎么做呢?我将使用数据集进行聚类,CLARA将计算从一个缺失的反对到另一个的距离。创建示例,CLARA将为medoid分配一个NA值。我编辑了我的帖子,以展示数据集的使用。正如我所说,这是一个解决办法。我认为它仍然回答了你的问题。你是对的,数据集中仍然有NA值。但是,我正在计算距离,只要每对观测数据至少缺少一个案例,没关系。我没有看到任何数据挖掘者将NAs转换为二进制变量。在某些情况下,将NA作为因子级别可能很有用,但我们需要在每个因子中使用NAs。这将是因为
Storedf
中未定义
x
。对于实际数据,请尝试
Store4df.m。是的,您可以添加多个变量,例如
require(caret)
# Make sure variables you are using are factors

VARS.TO.MAKE.DUMMY <-  #list of variables to convert to dummy
    c("HouseholdIncome", "Age")

dat.temp <- # Temporary data.frame to make dummies
    Store4df[,VARS.TO.MAKE.DUMMY]

dummy.vars <- # create dummies  
    predict(  
        dummyVars(  
            ~ .,   
            data = dat.temp
            ),
        newdata = dat.temp,
        na.action = na.pass
        )

Store4df <- # Append results to original dataframe
    cbind(Store4df, as.data.frame(dummy.vars))

rm(dummy.vars, dat.temp) # Garbage collection