在R中缩放data.table列的子集

时间:2013-03-17 18:40:05

标签: r data.table

我想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 中有很多这样的,所以我想避免通过名称来指定它们。没有缩放的列,我只想按原样返回。以下是我希望能够发挥作用但却没有:

{{1}}

有什么建议吗?

2 个答案:

答案 0 :(得分: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从调用范围中的变量值而不是列名sc本身获取LHS值。 ]

答案 1 :(得分:3)

sx = cbind(x[,-(2:4),with=FALSE],data.table(scale(x[,2:4,with=FALSE])))

我怀疑,您的工作流程会更好地融合您的data.table到长格式。