我正在使用data.table
包来完成一些分析。我正在采取的步骤之一涉及使用by =
函数来获取聚合统计信息。但是,必须根据每个by
子集中的唯一结果计算聚合。我一直在使用unique
和密钥来确保每个by
组都包含不同的记录。有点像下面的东西:
dt_new <- dt_old[,uFunc_MyFunction(x = unique(.SD)),by = grouping_var]
我注意到.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
我想要了解的是,在第一个版本中,.SD
的密钥是一致的,而在第二个版本中,.SD
根本没有密钥。我认为它与by =
列没有直接包含在.SD
中这一事实有关,这是打破密钥,但我想确认我的逻辑。
所以,我的问题是:为什么数据表的子集.SD
在包含父数据表的键的一列用作{{1}时没有键分组变量?
答案 0 :(得分:3)
在这种情况下,由于按site, group, team
排序,在按site
分组时,可以保留group, team
的密钥,因为订单会得到维护。最简单的答案是我们似乎错过了这个案例。您能否仅通过此帖子的链接提出问题?
作为一种解决方法,您可以使用by
方法中的unique
参数来指定列。
正如大卫指出的那样,在每个群体中使用unique(.SD)
似乎没有必要,但这可能是另一个问题。