旋转 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
我正在练习旋转 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