【发布时间】:2016-06-08 17:27:00
【问题描述】:
我正在使用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 中这一事实有关,这打破了关键,但我想确认我的逻辑。
所以,我的问题是:为什么当包含父数据表键的列之一用作by 分组变量时,数据表的子集.SD 没有键?
【问题讨论】:
-
这个问题真的只是一个FR。
-
@eddi 什么是 FR?
-
FR = 功能请求
-
你为什么要首先按组运行
unique(.SD)?感觉效率很低。你不能只做data_new <- unique(dt_old)然后按组运行你的函数吗? -
@DavidArenburg 当然,但这不能回答我关于密钥如何在 .SD 和父级之间传递的问题。此外,如果您有大量数据,您可能不愿意创建仅包含唯一性的第二个副本,我认为在这种情况下会发生这种情况。
标签: r data.table