4

我想scale在我的data.table. 其中有很多我想要的,scale所以我想避免按名称指定它们。未缩放的列,我只想按原样返回。这是我希望的工作,但它没有:

require(data.table)
x = data.table(id=1:10, a=sample(1:10,10), b=sample(1:10,10), c=sample(1:10,10))
> dput(x)
structure(list(id = 1:10, a = c(1L, 6L, 10L, 7L, 5L, 3L, 2L, 
4L, 9L, 8L), b = c(4L, 9L, 5L, 7L, 6L, 1L, 8L, 10L, 3L, 2L), 
    c = c(2L, 7L, 5L, 6L, 4L, 1L, 10L, 9L, 8L, 3L)), .Names = c("id", 
"a", "b", "c"), row.names = c(NA, -10L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x1a85d088>)

sx = x[,c(id, lapply(.SD, function(v) as.vector(scale(v)))), .SDcols = colnames(x)[2:4]]
   Error in eval(expr, envir, enclos) : object 'id' not found

有什么建议么?

4

2 回答 2

9

您还可以在数据表的副本中通过引用分配

sc <- names(x)[2:4]

sx <- copy(x)[ , (sc) := as.data.table(scale(.SD)), .SDcols = sc]

scale 返回一个矩阵,而 iirc data.table 不喜欢矩阵列。

或者,

sx <- copy(x)[ , (sc) := lapply(.SD,scale), .SDcols = sc]

[ 周围的括号(sc)告诉从调用范围内的变量值而不是列名本身data.table中获取 LHS 值。sc]

于 2013-03-17T21:25:05.457 回答
3
sx = cbind(x[,-(2:4)],data.table(scale(x[,2:4])))

我怀疑,您的工作流程将 data.table 转换为长格式会更好。

于 2013-03-17T18:49:49.717 回答