在data.table中按组进行比例缩放

9
我希望您可以按照会话组对data.table中的一组变量进行比例缩放:
   session     score1    score2
1:       1 0.11111111 0.6000000
2:       1 0.00000000 0.5333333
3:       1 0.27777778 0.6666667
4:       1 0.66666667 0.8666667
5:       1 0.83333333 1.0000000
6:       2 0.07692308 0.5757576
7:       2 0.25641026 0.6363636
8:       2 0.00000000 0.5303030
9:       2 0.64102564 0.7878788
10:       2 0.84615385 1.0000000

我已经尝试过:

dt[,(2:3):=lapply(.SD,scale),by="session",.SDcols=2:3]

但是我收到了一个错误:
Error in `[.data.table`(dt, , `:=`((2:3), lapply(.SD, scale)), by = "session",  : 
All items in j=list(...) should be atomic vectors or lists. If you are trying something like j=list(.SD,newcol=mean(colA)) then use := by group instead (much quicker), or cbind or merge afterwards.

代码可以正常运行,但只有在没有分组变量(session)的情况下才能运行。我做错了什么?
1个回答

11

scale函数的输出是一个matrix,因此需要将其转换为vector

dt[, c("score1", "score2") := lapply(.SD, function(x) as.vector(scale(x))), by = session]
dt
#    session     score1     score2
# 1:       1 -0.7433155 -0.6859943
# 2:       1 -1.0530303 -1.0289917
# 3:       1 -0.2787433 -0.3429970
# 4:       1  0.8052585  0.6859944
# 5:       1  1.2698307  1.3719886
# 6:       2 -0.7847341 -0.6824535
# 7:       2 -0.2942753 -0.3650335
# 8:       2 -0.9949307 -0.9205191
# 9:       2  0.7567078  0.4285175
#10:       2  1.3172322  1.5394886

为了更好地理解,试着在一个简单的向量上尝试它。
scale(1:10)
#        [,1]
# [1,] -1.4863011
# [2,] -1.1560120
# [3,] -0.8257228
# [4,] -0.4954337
# [5,] -0.1651446
# [6,]  0.1651446
# [7,]  0.4954337
# [8,]  0.8257228
# [9,]  1.1560120
#[10,]  1.4863011

你如何针对一个特定的列或者一些指定的列来实现这个操作?如果只是针对score1列,那么代码应该是dt[, c("score1") := as.vector(scale(score1)), by = session] - aclong
1
啊,这里找到了答案 https://dev59.com/iIDba4cB1Zd3GeqPHrVq#24261274 - aclong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接