在R的data.table中,data.table的关键如何保存到使用.SD引用的子集中?

TAR*_*man 5 r data.table

我正在使用该data.table软件包来完成一些分析.我正在采取的其中一个步骤涉及使用该by =函数来获取聚合统计信息.但是,必须根据每个by子集中的唯一结果计算聚合.我一直在使用unique和键来确保每个by组都包含不同的记录.有点像下面的东西:

dt_new <- dt_old[,uFunc_MyFunction(x = unique(.SD)),by = grouping_var]
Run Code Online (Sandbox Code Playgroud)

我注意到键的关键.SD似乎根据键dt_oldby =语句的不同而有所不同.显然,这对我生成的子集是否唯一有影响.

我希望得到一些清晰度,所以我写了下面的内容.

library(data.table)
set.seed(1554)
dt_example <- data.table(id = 1:50,
                         site = sample(x = c("A","B","C"),
                                       size = 50,
                                       replace = TRUE,
                                       prob = c(0.4,0.4,0.2)),
                         group = sample(x = c("Eta","Mu","Omicron","Psi"),
                                        size = 50,
                                        replace = TRUE),
                         team = sample(x = 1:3,
                                       size = 50,
                                       replace = TRUE,
                                       prob = c(0.2,0.3,0.5)))

setkey(x = dt_example,
       group,
       team)

> dt_example[,as.list(key(.SD)),by = site]
   site    V1   V2
1:    B group team
2:    A group team
3:    C group team

setkey(x = dt_example,
       site,
       group,
       team)

> dt_example[,as.list(key(.SD)),by = site]
Empty data.table (0 rows) of 1 col: site
Run Code Online (Sandbox Code Playgroud)

我想要理解的是,为什么在第一个版本中,密钥.SD是一致的,而在第二个版本中,.SD根本没有密钥.我认为它与by =列不直接包含在内的事实有关.SD,这是打破密钥,但我想确认我的逻辑.

所以,我的问题是:为什么.SD当包含父数据表的键的一列用作by分组变量时,数据表的子集没有键?

Aru*_*run 3

在这种情况下,由于它是按 排序的site, group, team,而按 分组时site,可以保留键,group, team因为顺序将保持不变。最简单的答案是我们似乎错过了这个案例。您能否仅通过此帖子的链接提出问题?

作为解决方法,您可以使用data.tables 方法by中的参数unique来指定列。

正如大卫指出的那样,unique(.SD)对每个组都使用似乎没有必要,但这可能是另一个问题。