【问题标题】:Function in R that creates dummy variables if a condition is met如果满足条件,R中的函数会创建虚拟变量
【发布时间】:2017-07-19 18:23:33
【问题描述】:

我希望创建一个函数,将任何超过 4 个级别的因子变量转换为虚拟变量。数据集有 ~2311 列,所以我真的需要创建一个函数。您的帮助将不胜感激。

我已经编译了下面的代码,并希望让它工作。

library(dummies)

# example function

for(i in names(Final_Dataset)){
    if(count (Final_Dataset[i])>4){
        y <- Final_Dataset[i]
        Final_Dataset <- cbind(Final_Dataset, dummy(y, sep = "_"))    
    }
}

我还在考虑另一种方法,我将获取需要虚拟化的所有列数,然后遍历所有列,如果列号在该数组中,则从变量中创建虚拟变量。

【问题讨论】:

    标签: r


    【解决方案1】:

    示例数据

    fct = data.frame(a = as.factor(letters[1:10]), b = 1:10, c = as.factor(sample(letters[1:4], 10, replace = T)), d = as.factor(letters[10:19]))
    
    str(fct)
    
    'data.frame':   10 obs. of  4 variables:
     $ a: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10
     $ b: int  1 2 3 4 5 6 7 8 9 10
     $ c: Factor w/ 4 levels "a","b","c","d": 2 4 1 3 1 1 2 3 1 2
     $ d: Factor w/ 10 levels "j","k","l","m",..: 1 2 3 4 5 6 7 8 9 10
    
    # keep columns with more than 4 factors
    fact_cols = sapply(fct, function(x) is.factor(x) && length(levels(x)) > 4)
    
    # create dummy variables for subset (omit intercept)
    dummy_cols = model.matrix(~. -1, fct[, fact_cols])
    
    # cbind new data
    out_df = cbind(fct[, !fact_cols], dummy_cols)
    

    【讨论】:

    • 您的fact_cols 定义可以简化一点:fact_cols = sapply(fct, function(x) is.factor(x) &amp;&amp; length(levels(x)) &gt; 4)。这将返回一个布尔向量,因此您还需要在最后一行将 -fact_cols 更改为 !fact_cols
    • 大家好,超级答案,我试过了,看看输出-
    • fact_cols = unlist(lapply(1:ncol(Final_Dataset), function(x) is.factor(Final_Dataset[, x]) && length(levels(Final_Dataset[, x])) > 4) ) > > # 为子集创建虚拟变量 > dummy_cols = model.matrix(~. -1, Final_Dataset[, fact_cols]) 有 12 个警告(使用 warnings() 来查看) > > # cbind 新数据
    • > out_df = cbind(Final_Dataset[, -fact_cols], dummy_cols) data.frame(..., check.names = FALSE) 中的错误:参数暗示不同的行数:15257, 0
    • @Lowpar 它适用于 Lampros 的良好共享数据。如果它不适用于您的数据,您应该共享一个说明性子集,以便我们可以尝试调试。请将其编辑到问题中。使用dput,以便复制/粘贴。见提示here
    【解决方案2】:

    您可以通过类似的方式获取所有级别超过给定数量 (n = 4) 的列

    which(sapply(Final_Dataset, function (c) length(levels(c)) > n))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2020-06-27
      • 2013-09-23
      • 1970-01-01
      相关资源
      最近更新 更多