【问题标题】:scale by group in data.table在 data.table 中按组缩放
【发布时间】:2017-01-27 07:03:47
【问题描述】:

我想按组“会话”缩放 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.

代码有效,但只有没有分组变量(会话)。我做错了什么?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    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]
    • 啊,在这里找到答案stackoverflow.com/a/24261274/10087503
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2015-01-13
    • 2014-01-11
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    相关资源
    最近更新 更多