如何在R中创建虚拟变量?

lis*_*isa 7 variables r

所以,我的数据集包含15个变量,其中一个(性别)只有2个级别.我想将它用作虚拟变量,但级别为1和2.我该怎么做?我希望有0级和1级,但我不知道如何在R中管理它!

Rei*_*son 22

由于大多数R的建模工具都带有公式接口,因此您无需创建虚拟变量,处理和解释公式的基础代码将为您完成此操作.如果您因某些其他原因需要虚拟变量,那么有几个选项.最简单的(恕我直言)是使用model.matrix():

set.seed(1)
dat <- data.frame(sex = sample(c("male","female"), 10, replace = TRUE))

model.matrix( ~ sex - 1, data = dat)
Run Code Online (Sandbox Code Playgroud)

这使:

> dummy <- model.matrix( ~ sex - 1, data = dat)
> dummy
   sexfemale sexmale
1          0       1
2          0       1
3          1       0
4          1       0
5          0       1
6          1       0
7          1       0
8          1       0
9          1       0
10         0       1
attr(,"assign")
[1] 1 1
attr(,"contrasts")
attr(,"contrasts")$sex
[1] "contr.treatment"

> dummy[,1]
 1  2  3  4  5  6  7  8  9 10 
 0  0  1  1  0  1  1  1  1  0
Run Code Online (Sandbox Code Playgroud)

您可以使用任一列dummy作为数字虚拟变量; 选择您想要成为1基础级别的列.dummy[,1]选择1代表女性阶级和dummy[,2]男性阶级.

如果您希望将其解释为分类对象,请将其作为一个因素:

> factor(dummy[, 1])
 1  2  3  4  5  6  7  8  9 10 
 0  0  1  1  0  1  1  1  1  0 
Levels: 0 1
Run Code Online (Sandbox Code Playgroud)

但那是在击败因素的对象; 还有什么0


Jil*_*ina 9

这个

set.seed(001) # generating some data
sex <- factor(sample(1:2, 10, replace=TRUE)) # this is what you have
[1] 1 1 2 2 1 2 2 2 2 1
Levels: 1 2

sex<-factor(ifelse(as.numeric(sex)==2, 1,0)) # this is what you want
sex  
 [1] 0 0 1 1 0 1 1 1 1 0
Levels: 0 1
Run Code Online (Sandbox Code Playgroud)

如果你想要标签是0 =男性和1 =女性,那么......

sex<-factor(ifelse(as.numeric(sex)==2, 1,0), labels=c('M', 'F')) 
sex # this is what you want
[1] M M F F M F F F F M
Levels: M F
Run Code Online (Sandbox Code Playgroud)

实际上你不需要创建一个虚拟变量来估计模型使用lm,让我们看看这个例子:

set.seed(001) # Generating some data
N <- 100
x <- rnorm(N, 50, 20)
y <- 20 + 3.5*x + rnorm(N)
sex <- factor(sample(1:2, N, replace=TRUE))

# Estimating the linear model 
lm(y ~ x + sex) # using the first category as the baseline (this means sex==1)

Call:
    lm(formula = y ~ x + sex)

Coefficients:
(Intercept)            x         sex2  
   19.97815      3.49994     -0.02719     


# renaming the categories and labelling them
sex<-factor(ifelse(as.numeric(sex)==2, 1,0), labels=c('M', 'F'))
lm(y ~ x + sex)  # the same results, baseline is 'Male'

Call:
lm(formula = y ~ x + sex)

Coefficients:
(Intercept)            x         sexF  
   19.97815      3.49994     -0.02719 
Run Code Online (Sandbox Code Playgroud)

正如你可以看到R很好地处理假人,你只需将它们作为factor变量传递给公式,R将为你做剩下的事.

顺便说一下,没有必要将类别从c(2,1)更改为c(0,1),结果将与您在上面的示例中看到的相同.