【问题标题】:Pivoting data.table where order matters for some functions and not for some functions?将 data.table 旋转到某些功能的顺序而不是某些功能的位置?
【发布时间】:2020-10-04 18:40:23
【问题描述】:

我正在练习旋转data.table,下面的示例使用lapply 来获取子结构特征及其对应的列,其中键列的排序很重要,这可以看作是电子表格工具中的旋转。这类似于数据透视表和可能称为立方体的 R 工具,其他小计工具可能比lapply 更易于使用。我愿意与更方便的工具进行比较,lapply 似乎在您需要更多功能时变得非常简洁,尤其是在不同订单时。

演示

我在data.table 中使用paste0 形成新的子类别,我想在这些子类别上计算特征,例如平均值和总和。下面是带有输入和预期输出的小示例。

输入

> data.table(cn=c('a','a','b','b','c'),test=c(1,2,3,4,0),cat=c(1,1,1,2,2))
   cn test cat
1:  a    1   1
2:  a    2   1
3:  b    3   1
4:  b    4   2
5:  c    0   2
> myData <- data.table(cn=c('a','a','b','b','c'),test=c(1,2,3,4,0),cat=c(1,1,1,2,2))
> myData[order(test), lapply(.SD, paste0, collapse = '>'), by = c('cat')]  
   cat    cn  test
1:   2   c>b   0>4
2:   1 a>a>b 1>2>3  

#How can I add here new functions to get new columns for the segments such as a>a>b

输出

   cat    cn  test  test_sum test_avg
1:   1 a>a>b 1>2>3  6        2
2:   2   c>b   0>4  4        2

更简单地说,我们如何通过输入获得输出? lapply 是这里的正确选择吗?请注意,排序对某些功能很重要,而对某些功能无关。

如何在某些函数需要排序而某些不需要排序的地方正确地旋转 data.table?

【问题讨论】:

    标签: r data.table pivot-table lapply subtotal


    【解决方案1】:

    这样的?

    #set keys for ordering
    setkey(DT, cat, test )
    #
    DT[, .(cn       = paste0( cn, collapse = ">"),
           test     = paste0( test, collapse = ">" ),
           test_sum = sum( test ),
           test_avg = mean( test ) ), 
       by = cat ]
    
    #    cat    cn  test test_sum test_avg
    # 1:   1 a>a>b 1>2>3        6        2
    # 2:   2   c>b   0>4        4        2
    

    但是,您也可以在代码行内排序,使用 sort()
    下面,我按降序对text 进行了排序(只是为了表明可以做到)。

    DT[, .(cn       = paste0( cn, collapse = ">"),
           test     = paste0( sort( test, decreasing = TRUE ), collapse = ">" ),
           test_sum = sum( test ),
           test_avg = mean( test ) ), 
       by = cat ]
    
    #    cat    cn  test test_sum test_avg
    # 1:   1 a>a>b 3>2>1        6        2
    # 2:   2   c>b   4>0        4        2
    

    【讨论】:

    • 我喜欢这里的简单明了 +1。第二种情况是否适用于任何订购?我目前正在单独计算事物,然后使用合并(左连接)来组合结果,但是如果了解如何使用任何排序来解决,第二种情况可能很接近(对于顺序很重要的函数,您要确保它们不混合在一起)。
    • 如果要在函数中使用列之前对其进行排序,请使用如下内容:sort( data, decreasing = TRUE /FALSE),如第二个代码块的第二行所示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2012-05-31
    • 2013-08-21
    相关资源
    最近更新 更多