有人能解释一下在这个交互运行R代码中发生了什么吗?我在Ubuntu Linux上使用dplyr 1.1.2data.table 1.14.8.请注意,只有在将索引隐式分配给dt1行之后,才会出现这种差异.在这种情况下,为什么dt[cond]给出的结果与subset(dt, cond)不同?将data.tabletidyverse函数组合在一个链中通常是"危险的"吗?

library(data.table)
library(dplyr)
mydt1 = data.table(year=rep(2017:2018, each=3), month=rep(1:3, times=2))
mydt2 = data.table(year=rep(2016:2017, each=3), month=rep(4:6, times=2))
mydt1[year == 2018]    # this appears to assigns `year` as an index to mydt1 
rbindlist(list(mydt1, mydt2))[year == 2017]
# produces expected output:
#    year month
# 1: 2017     1
# 2: 2017     2
# 3: 2017     3
# 4: 2017     4
# 5: 2017     5
# 6: 2017     6
subset(bind_rows(mydt1, mydt2), year == 2017)
# produces the same output as above
bind_rows(mydt1, mydt2)[year == 2017]
# what happens now?
#    year month
# 1: 2017     1
# 2: 2017     2
# 3: 2017     3

推荐答案

你现在看到的是"auto-indexing".对于data.table,只能有一个物理指数(即setkey),但也可以有二级指数.作为一项功能(为了更快地下注),每当使用严格==%in%完成子集时,都会创建二级索引并与对象一起存储.

对于data.table个对象,当组合表时,索引被删除,正如人们可能预期的那样:

indices(mydt1)
# [1] "year"        "year__month"
indices(mydt2)
# NULL
rbindlist(list(mydt1, mydt2)) |>
  indices()
# NULL
rbindlist(list(mydt2, mydt1)) |>
  indices()
# NULL

但对于dplyr_1.1.2个(至少,不确定是否/何时发生了变化),它保留了第一个表的属性.

bind_rows(mydt1, mydt2) |>
  indices()
# [1] "year"        "year__month"
bind_rows(mydt2, mydt1) |>
  indices()
# NULL

后一项发现表明,我们可以通过颠倒表格来获得预期的结果:

bind_rows(mydt1, mydt2)[year == 2017]
#     year month
#    <int> <int>
# 1:  2017     1
# 2:  2017     2
# 3:  2017     3
bind_rows(mydt2, mydt1)[year == 2017]
#     year month
#    <int> <int>
# 1:  2017     4
# 2:  2017     5
# 3:  2017     6
# 4:  2017     1
# 5:  2017     2
# 6:  2017     3

从文档(上面的相同链接)中,我们可以设置"datatable.use.index"选项以防止此行为.在新的R会议上(因为我不想 destruct 事情):

options(datatable.use.index = FALSE)
mydt1 = data.table(year=rep(2017:2018, each=3), month=rep(1:3, times=2))
mydt2 = data.table(year=rep(2016:2017, each=3), month=rep(4:6, times=2))
mydt1[year == 2018]
#     year month
#    <int> <int>
# 1:  2018     1
# 2:  2018     2
# 3:  2018     3
indices(mydt1)
# NULL
bind_rows(mydt1, mydt2)[year == 2017]
#     year month
#    <int> <int>
# 1:  2017     1
# 2:  2017     2
# 3:  2017     3
# 4:  2017     4
# 5:  2017     5
# 6:  2017     6

因此,我猜测这不是dplyrdata.table中的"错误",但如果dplyr"知道"这个二级索引,并且在将它们行绑定在一起时 Select 不传递这个索引,那就太好了.

R相关问答推荐

如果R上的不同时期之间的值发生了变化,则创建假人

指定要保留在wrap_plots中的传奇

我可以截断10字节的扩展数并转换为8字节的double吗?

如何使用Cicerone指南了解R Shiny中传单 map 的元素?

如何判断某列中由某些行组成的百分比

使用Shiny组合和显示复制和粘贴的数据

在R底座中更改白天和夜晚的背景 colored颜色

r—绘制相交曲线

根据多个条件增加y轴高度以适应geom_text标签

使用外部文件分配变量名及其值

提取第一个下划线和最后一个下划线之间的任何内容,例外情况除外

将多列合并为单独的名称—值对

有效识别长载体中的高/低命中

如何将SAS数据集的列名和列标签同时包含在r中GT表的表首?

从圆到R中的多边形的标绘雷达图

更改STAT_VALLES/STAT_PEAKS中的箭头线宽/大小

正在导出默认的RStudio主题,还是设置括号 colored颜色 ?

使用gt_summary是否有一种方法来限制每个变量集进行配对比较?

如果条件匹配,则使用Mariate粘贴列名

如何在R中创建这些列?