创建虚拟变量

时间:2017-04-01 11:40:46

标签: r

我正在尝试编写一个默认函数,该函数适用于数据集中的任何变量,并在删除原始变量后依次为其创建虚拟变量。

dummy= function(x){
    xs = union(x,NULL)
    xm = matrix(0, length(x), length(xs))
    for(i in 1:length(x)){
        xm[i,which(xs==x[i])] = 1
    }
    return(xm[,1:length(xs)-1])
}

例如,从数据集中,我有一个名为“已婚”的分类变量。现在我想创建这样的虚拟变量 结婚未婚 1 0 1 0 0 1 0 1 0 1  此外,它应删除原始变量“已婚”并将虚拟变量添加到数据集。

1 个答案:

答案 0 :(得分:0)

从dummies包中查看dummy.data.frame函数documentation。它允许灵活使用model.matrix函数。

library(dummies)
set.seed(20170402)
n <- 5
df <- data.frame(x = rnorm(n), 
                 y = rnorm(n, 1), 
                 red_herring = as.logical(round(runif(n, 0, 1))))

# Character column
df$red_herring <- dplyr::if_else(df$red_herring == T, 'Yes', 'No', NA_character_)

# Factor column
df$married <- factor(df$red_herring, levels = c('No', 'Yes'))

默认情况下,为字符和因子类创建虚拟变量:

dummies::dummy.data.frame(df)
#             x         y red_herringNo red_herringYes marriedNo marriedYes
# 1 -2.49355296 1.6209886             0              1         0          1
# 2  0.06896791 2.6101371             1              0         1          0
# 3 -0.01188042 0.4857511             0              1         0          1
# 4  0.47565318 1.1194925             0              1         0          1
# 5  0.34437239 3.0801658             1              0         1          0

您可以将要转换的变量向量传递给names参数:

dummies::dummy.data.frame(df, names = 'married')
#             x         y red_herring marriedNo marriedYes
# 1 -2.49355296 1.6209886         Yes         0          1
# 2  0.06896791 2.6101371          No         1          0
# 3 -0.01188042 0.4857511         Yes         0          1
# 4  0.47565318 1.1194925         Yes         0          1
# 5  0.34437239 3.0801658          No         1          0

或者您可以通过dummy.classes指定要转换为虚拟变量的变量类:

dummies::dummy.data.frame(df, dummy.classes = 'factor')
#             x         y red_herring marriedNo marriedYes
# 1 -2.49355296 1.6209886         Yes         0          1
# 2  0.06896791 2.6101371          No         1          0
# 3 -0.01188042 0.4857511         Yes         0          1
# 4  0.47565318 1.1194925         Yes         0          1
# 5  0.34437239 3.0801658          No         1          0
相关问题