我正在寻找一种更快的数据表替代relist
函数,特别是skeleton
参数,它允许您根据特定结构对值进行分组。我知道by
选项会为您执行此操作,但这仅适用于数据表中的列。我想最终从数据表中获取一列值,并根据已创建的值“框架”对这些值进行分组。例如,下面的代码显示了如何创建listFrame
,并将根据每个数字序列将skeleton
参数传递给组值。
library(data.table)
sampleData <- data.table(rep(seq(0,10), each = 10))
sampleData <- sampleData[-(sample(1:length(sampleData[[1]]), 25))]
nList <- as.data.table(sampleData[, table(V1)])
listFrame <- data.table(sapply(1:nrow(nList), function(x) 1:nList$N[x]))
sampleData <- relist(sampleData[[1]], listFrame[[1]])
此外,在重新sampleData
之后,我计划使用lapply
在每个子列表上应用函数。如果可以使用data.table
完成所有操作,那就太棒了。
lapply(1:length(sampleData), function(x) median(sampleData[[x]]))
答案 0 :(得分:1)
如果我理解得很清楚,那么listFrame
骨架是V1
中计算相同数字的一种方式。由于您的输入数据在V1
上排序,我认为与您可以使用函数rleid
获得的游程长度类型组ID相同。
因此,您可以按rleid(V1)
进行分组,然后应用median
library(data.table)
sampleData <- data.table(rep(seq(0,10), each = 10))
sampleData <- sampleData[-(sample(1:length(sampleData[[1]]), 25))]
sampleData[, .(med = median(V1)), by = .(V1, rleid(V1))][, rleid := NULL][]
#> V1 med
#> 1: 0 0
#> 2: 1 1
#> 3: 2 2
#> 4: 3 3
#> 5: 4 4
#> 6: 5 5
#> 7: 6 6
#> 8: 7 7
#> 9: 8 8
#> 10: 9 9
#> 11: 10 10
列med
中的结果与您的示例相同,但存储在不是列表的表中。
评论精确度
rleid
是一种创建ID列的方法。如果我采用函数dplR::tbrm
的特定情况,您只需要一个ID列来应用该函数。
library(data.table)
library(dplR)
sampleData <- data.table(rep(seq(0,10), each = 10))
sampleData <- sampleData[-(sample(1:length(sampleData[[1]]), 25))]
创建ID列:
sampleData[, ID := LETTERS[rleid(V1)]]
按ID
sampleData[, dplR::tbrm(V1), by = ID]
#> ID V1
#> 1: A 0
#> 2: B 1
#> 3: C 2
#> 4: D 3
#> 5: E 4
#> 6: F 5
#> 7: G 6
#> 8: H 7
#> 9: I 8
#> 10: J 9
#> 11: K 10