关于编写泛型函数以在R中编码变量的建议

时间:2016-02-14 16:00:25

标签: r

我有一个data.frame:

mydata = data.frame(v1 = c("A", "A", "A", "B", "B", "C", "D"),
                v2 = c("XY", "XY", "ZZ", "BB", "ZZ", NA, "ZZ"),
                v3 = 5)

我想将数据帧中的每个字符编码为与每个级别对应的整数。我也想“忽略”NA值。预期的产出将等于:

output = data.frame(v1 = c(1, 1, 1, 2, 2, 3, 4),
                 v2 = c(1, 1, 2, 3, 2, NA, 2),
                 v3 = 5)

我希望编写一个接受data.frame对象的函数和一个指定我想要执行操作的列的列表,如:

my_function = function(df, vars){
  ...
}

编辑:在上面的例子中,“vars”将是= c(“v1”,“v2”)

有关如何处理此问题的任何建议?我愿意使用dplyr等软件包来帮助。

谢谢, d

1 个答案:

答案 0 :(得分:0)

我们可以转换为factor,然后强制转换为numeric

mydata[1:2] <- lapply(mydata[1:2], function(x) 
     as.numeric(factor(x, levels=unique(x))))

这可以转换为函数

myfunction <- function(df, vars) {
   df[vars] <- lapply(df[vars], function(x) 
             as.numeric(factor(x, levels=unique(x))))
   df
 }

myfunction(mydata, c('v1', 'v2'))

#  v1 v2 v3
#1  1  1  5
#2  1  1  5
#3  1  2  5
#4  2  3  5
#5  2  2  5
#6  3 NA  5
#7  4  2  5

如果我们需要进一步推广它,我们可能需要检查列类,即它是否是numeric列,如果不是,则更改为factor并指定levels并强迫numeric

 mydata[] <- lapply(mydata, function(x) 
        if(!is.numeric(x)) as.numeric(factor(x, levels=unique(x))) 
             else x)