我正在使用该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_old和by =语句的不同而有所不同.显然,这对我生成的子集是否唯一有影响.
我希望得到一些清晰度,所以我写了下面的内容.
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分组变量时,数据表的子集没有键?
在这种情况下,由于它是按 排序的site, group, team,而按 分组时site,可以保留键,group, team因为顺序将保持不变。最简单的答案是我们似乎错过了这个案例。您能否仅通过此帖子的链接提出问题?
作为解决方法,您可以使用data.tables 方法by中的参数unique来指定列。
正如大卫指出的那样,unique(.SD)对每个组都使用似乎没有必要,但这可能是另一个问题。