以下是我的代码:

require(data.table)

data("USArrests")
dt1 <- as.data.table(USArrests, keep.rownames = T)
dt1[, state:=rn]
setkey(dt1, state)

key(dt1)
# "state"

states1 <- c('Iowa','Ohio','Utah')
states2 <- c('Utah','Iowa','Ohio')

dt.subset1 <- dt1[states1]
dt.subset1 # 3 rows as expected
key(dt.subset1) # "state", as expected
# "state"

dt.subset2 <- dt1[states2]
dt.subset2 # 3 rows as expected
key(dt.subset2) # NULL - why?
# NULL

dt.subset2a <- dt1[sort(states2)]
dt.subset2a # 3 rows as expected
key(dt.subset2a)
# state

dt1[states1]dt1[states2]都像预期的那样返回正确的子集,但只有第一个保留键列,而第二个重置键列.似乎只有在预排序值的情况下,密钥才是保守的--但这是预期的/有记录的行为吗?

推荐答案

states1的顺序会影响数据的顺序.值得注意的是,返回的行按向量中的州的顺序排列,这很可能是所需的.

然而,按照data.table处理关键字的方式,一旦内部的关键字字段不再排序(因为key(.)操作在内部重新排序行),它就取消设置数据中的关键字.

只要states的顺序与键控表中的顺序相同,则返回的数据将保留该键.我知道这个例子很简单,但是在您的实际数据中,如果您创建states2,使值的顺序与键控表中的顺序相同--在本例中按字母顺序--那么返回的表应保留其键.

仅供参考,https://cran.r-project.org/web/packages/data.table/vignettes/datatable-keys-fast-subset.html

R相关问答推荐

R数据帧中的布尔加法会产生布尔值而不是整值

使用facet_wrap()时如何将面板标题转换为脚注?

按自定义数字模式对变量名称排序

创建重复删除的唯一数据集组合列表

计算R中的威布尔分布的EDF

无法将传奇添加到cowplot多情节中

derrr summarise每个组返回多行?

在数学中正确显示摄氏度、开氏度或华氏度

RStudio中相关数据的分组箱形图

在R中将特定列的值向右移动

在连续尺度上转置标签[瀑布图,R]

根据元素和前一个值之间的差值过滤矩阵的元素

从所有项的 struct 相同的两级列表中,将该第二级中的所有同名项绑定在一起

为左表中的所有行使用值Fill滚动左连接

R:如果为NA,则根据条件,使用列名模式将缺少的值替换为另一列中的值

在R中使用列表(作为tibble列)进行向量化?

如何在使用因子时获得Sankey图的Scale_Fill_Viridis的全范围

如何将宽格式的患者信息数据高效地转换为患者计数的时间序列?

将CSV转换为R中的自定义JSON格式

如何在R中使用因子行求和?