data.table按引用赋值(:=)能否保留向量名称?如何实现?
差异原因
这是两个包设计定位不同导致的默认行为差异:
- data.table核心设计目标是高性能处理大规模数据,
:=赋值时默认只保留向量的核心值与类型属性,会主动剥离names这类非必要的元数据,避免额外的内存占用与计算开销。 - dplyr的mutate默认完整保留输入向量的所有属性,包括names,是通用性优先的设计选择。
强制保留名称的解决方案
有两种常用的实现方式,按需选择即可:
方法1:赋值时同步保留名称
直接在:=的右值表达式中显式保留names属性:
dt2 <- dt[, movColor := `names<-`(movieColors[movie], names(movieColors[movie]))]
方法2:赋值后补加属性(大数据量下性能更优)
先完成值的赋值,再通过setattr原地添加names属性,不会触发数据拷贝:
dt2 <- dt[, movColor := movieColors[movie]] data.table::setattr(dt2$movColor, "names", dt2$movie)
两种方法处理后,再运行dplyr::all_equal(dt1, dt2)就会返回TRUE,和dplyr的处理结果完全一致。
内容的提问来源于stack exchange,提问作者MeepMorpRobotVoice
相关产品推荐
相关产品推荐

