【问题标题】:In R's data.table, how is the key of a data.table preserved into subsets referenced using .SD?在 R 的 data.table 中,如何将 data.table 的键保存到使用 .SD 引用的子集中?
【发布时间】: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_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 中这一事实有关,这打破了关键,但我想确认我的逻辑。

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

【问题讨论】:

  • 这个问题真的只是一个FR。
  • @eddi 什么是 FR?
  • FR = 功能请求
  • 你为什么要首先按组运行unique(.SD)?感觉效率很低。你不能只做data_new &lt;- unique(dt_old) 然后按组运行你的函数吗?
  • @DavidArenburg 当然,但这不能回答我关于密钥如何在 .SD 和父级之间传递的问题。此外,如果您有大量数据,您可能不愿意创建仅包含唯一性的第二个副本,我认为在这种情况下会发生这种情况。

标签: r data.table


【解决方案1】:

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

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

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

【讨论】:

  • 我会立即记录一个问题。我同意unique(.SD) 是一个不寻常的用例。我什至不希望它被“修复”——只是好奇引擎盖下发生了什么。
猜你喜欢
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多