【问题标题】:Create dummy variable [duplicate]创建虚拟变量[重复]
【发布时间】:2023-03-14 02:08:01
【问题描述】:

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

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 它还应该删除原始变量“Married”并将虚拟变量添加到数据集。

【问题讨论】:

  • 请注意,R 会在运行统计模型时动态创建虚拟变量,因此可能没有必要提前构建它们。
  • @niton 我明白你的意思..但我正在处理一个巨大的数据集,每次创建虚拟变量都是一项繁琐的任务。所以我想创建一个默认函数,这样我就可以运行函数并获取变量。

标签: r


【解决方案1】:

从 dummies 包中查看 documentation 中的 dummy.data.frame 函数。它允许灵活使用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

【讨论】:

    【解决方案2】:

    虽然我会分享我的答案,因为我一直在寻找类似的东西,最终找到了一个对我来说效果很好的解决方案。 我在一个非常大的数据集中有一个分类列,我需要将其转换为虚拟变量,而不能使用 matrix.model

    使用索引稀疏矩阵我能够解决我的问题。如果您的数据很大(我的数据有 580 万行,分类数据有近 500 个级别!),它的速度非常快并且不会耗尽您的内存!

    请参阅此帖子以获取更多信息: create a sparse matrix; given the indices of non-zero elements for creation of dummy variables of a categorical column of a large dataset

    这是用于将一个分类列转换为虚拟变量,但是,您可以通过调整数据并更改其格式轻松地将其扩展到多个。例如,一种方法是将所有分类变量组合到一个分类列中并扩展级别数:

    Cat Var2:100 级
    Cat Var3:50 级

    您通过将 Var2 和 Var3 组合到 Var4 中来创建一个虚拟分类数据:

    Cat Var4:150 个级别(前 100 个级别对应 Var2,其余 50 个级别对应 Var3)

    使用索引稀疏矩阵非常快速且内存高效。并且不需要丑陋的 for 循环。 希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 2023-03-27
      • 2020-05-13
      • 2019-11-22
      • 2018-04-06
      • 2020-01-31
      • 1970-01-01
      • 2017-05-31
      • 2015-08-17
      相关资源
      最近更新 更多