我有一个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
答案 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)