【发布时间】:2016-03-04 16:29:47
【问题描述】:
这个问题出现在机器学习情况下,其中有一组初始数据(称为 dtrain)和随后的一组相似数据(称为 dtest),我希望首先考虑一列类字符和然后转换为数字。我希望将字符串分解为数字映射以在两个数据表中保持一致。由于我会先遇到 dtrain,所以我只会看到数据的一个子集。当我遇到 dtest 时,我会想重用相同的级别并为新的唯一字符串添加新级别。
一个简单的例子:
dtrain <- data.table( colors = c('red','white','blue'))
dtest <- data.table( colors = c('green','white','red'))
factor(dtrain$colors)
[1] red white blue
Levels: blue red white
dtrain$colors <- as.numeric(factor(dtrain$colors))
dtrain$colors
[1] 2 3 1
color_levels <- c(c('blue','red','white'), c('green'))
dtest$colors <- as.numeric(factor(dtest$colors, color_levels))
dtest$colors
[1] 4 3 2
这里我们看到 white(3) 和 red(2) 在两者中是一致的,green(4) 在 dtest 中而不是 dtrain 中找到,因此在 dtrain$color 所需的所有级别之后得到一个级别。
我能够编写一个函数,该函数将根据两个数据表和目标列适当地构建级别。
ab.levels <- function( da, db, col_x ) {
arguments <- as.list(match.call())
ax <- sort(unique(eval(arguments$col_x, da)))
bx <- unique(eval(arguments$col_x, db))
return(c(ax, sort(setdiff(bx,ax))))
}
dtrain <- data.table( colors = c('red','white','blue'))
dtest <- data.table( colors = c('green','white','red'))
ab.levels( dtrain, dtest, colors)
[1] "blue" "red" "white" "green"
现在我想要一个可以随意应用的函数,它将列转换为数字并保持从第一个表到第二个表的级别顺序。这是我使用 ab.levels() 的幼稚代码,但不起作用:
ab.char.to.numeric <- function (da, db, col_x)
{
col_levels <- ab.levels( da, db, col_x)
da$col_x <- as.numeric(factor(da$col_x, col_levels))
db$col_x <- as.numeric(factor(db$col_x, col_levels))
}
【问题讨论】:
标签: r function parameters data.table