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

时间:2016-06-08 17:27:01

标签: r data.table

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

dt_new <- dt_old[,uFunc_MyFunction(x = unique(.SD)),by = grouping_var]

我注意到.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

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

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

1 个答案:

答案 0 :(得分:3)

在这种情况下,由于按site, group, team排序,在按site分组时,可以保留group, team的密钥,因为订单会得到维护。最简单的答案是我们似乎错过了这个案例。您能否仅通过此帖子的链接提出问题?

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

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