数据表替代relist函数R.

时间:2016-03-02 23:17:17

标签: r list data.table

我正在寻找一种更快的数据表替代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]]))

1 个答案:

答案 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