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

时间:2016-01-25 18:53:44

标签: r anonymous-function dummy-variable

想象一下,您有一个带有分类变量的数据集,并且您希望将其转换为虚拟变量:

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 个答案:

答案 0 :(得分:3)

在您的函数中添加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