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

在R';s data.table,如何将data.table的键保存到使用.SD引用的子集中?,r,data.table,R,Data.table,我正在使用data.table包来完成一些分析。我正在采取的步骤之一是使用by=函数获取聚合统计信息。但是,必须根据每个by子集中的唯一结果计算聚合。我一直在使用unique和键来确保每个by组包含不同的记录。大致如下: dt_new <- dt_old[,uFunc_MyFunction(x = unique(.SD)),by = grouping_var] 我试图理解的是,为什么在第一个版本中,.SD的键是一致的,而在第二个版本中,.SD根本没有键。我认为这与以下事实有关:by=列没

我正在使用
data.table
包来完成一些分析。我正在采取的步骤之一是使用
by=
函数获取聚合统计信息。但是,必须根据每个
by
子集中的唯一结果计算聚合。我一直在使用
unique
和键来确保每个
by
组包含不同的记录。大致如下:

dt_new <- dt_old[,uFunc_MyFunction(x = unique(.SD)),by = grouping_var]
我试图理解的是,为什么在第一个版本中,
.SD
的键是一致的,而在第二个版本中,
.SD
根本没有键。我认为这与以下事实有关:
by=
列没有直接包含在
.SD
中,这会破坏关键,但我想确认我的逻辑


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

在这种情况下,因为它是按
站点、组、团队
排序的,而按
站点
分组的,可以为
组、团队保留密钥,因为将维护订单。最简单的答案是我们似乎错过了这个案子。你能用这个帖子的链接提交一个问题吗

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


正如David所指出的,在每个组上使用
unique(.SD)
似乎没有必要,但这可能是另一个问题。

这个问题实际上只是一个FR.@eddi什么是FR?FR=Feature request为什么要按组运行
unique(.SD)
?感觉效率很低。你不能只做
data\u new@DavidArenburg当然可以,但这不能回答我关于如何在.SD和父级之间传递密钥的问题。另外,如果你有很多数据,你可能不愿意只使用unique创建第二个副本,我认为在这种情况下会发生这种情况。我会立即记录一个问题。我同意
unique(.SD)
是一个不寻常的用例。我甚至不希望它被“修复”——只是好奇引擎盖下发生了什么。
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