代码之家  ›  专栏  ›  技术社区  ›  DomB

R: 使用匿名函数创建虚拟变量

  •  1
  • DomB  · 技术社区  · 10 年前

    假设你有一个带有分类变量的数据集,你想把它变成虚拟变量:

    df<-data.frame(read.table(header = TRUE, text = 
    "ID Mobile
    1 Yes
    2 No
    3 Yes
    4 Yes
    5 No"))
    

    我通常会这样做:

    for(level in levels(df$Mobile)){
    df[paste("Mobile", level, sep = "_")] <- ifelse(df$Mobile == level, 1,   0)
    }
    

    这很好。然而,现在假设你有很多这样的分类变量。您希望使用匿名函数,而不是多次复制和粘贴这三行代码。我试了一下:

    Mediatable<-function(VARIABLE1, DUMMY1, INDICATOR1){
       for(level in levels(VARIABLE1)){
          df[paste(DUMMY1, level, sep = "_")] <- ifelse(VARIABLE1 == level, 1, 0)
       }
    }
    

    然后,我将按如下方式触发它:

    Mediatable(df$Mobile, "Mobile") 
    

    我试了一下,什么也没发生。知道哪里出了问题吗?我真的很喜欢使用匿名函数来跨多个分类变量完成这项工作的想法。顺便说一句,请忽略我想通过粘贴为我的虚拟变量指定一个特定的名称。这在这里并不重要。谢谢

    1 回复  |  直到 10 年前
        1
  •  3
  •   Pierre L    10 年前

    添加 return(df) 调用函数。或使用 dcast 从…起 reshape2 对于另一种方法:

    library(reshape2)
    dcast(df, ...~Mobile, length)
    #   ID No Yes
    # 1  1  0   1
    # 2  2  1   0
    # 3  3  0   1
    # 4  4  0   1
    # 5  5  1   0
    

    使用您的功能:

    Mediatable<-function(VARIABLE1, DUMMY1, INDICATOR1){
            for(level in levels(VARIABLE1)){
                    df[paste(DUMMY1, level, sep = "_")] <- ifelse(VARIABLE1 == level, 1, 0)
            }
            return(df)
    }
    
    newdf <- Mediatable(df$Mobile, "Mobile") 
    newdf
    #   ID Mobile Mobile_No Mobile_Yes
    # 1  1    Yes         0          1
    # 2  2     No         1          0
    # 3  3    Yes         0          1
    # 4  4    Yes         0          1
    # 5  5     No         1          0