旋转 data.table 顺序对某些函数重要而不对某些函数重要?

Pivoting data.table where order matters for some functions and not for some functions?

我正在练习旋转 data.table,下面的示例使用 lapply 来获取子结构特征及其对应的列,其中键列的顺序很重要,这可以看作是电子表格工具中的旋转。这类似于pivot-table,也许R工具叫cube,其他小计工具可能比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?

是这样的吗?

#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