与sf包一起使用时,data.table的错误行为

问题描述:

data.tablesf::st_union一起使用时会出现不正确的聚合,而dplyr似乎可以正确处理它。有人可以解释为什么data.table产生这个结果吗?与sf包一起使用时,data.table的错误行为

library(data.table) 
library(sf) 
library(dplyr) 
nc <- st_read(system.file("shape/nc.shp",package="sf")) 
nc_DT <- as.data.table(nc) 
nc %>% group_by(SID74) %>% summarise(geom = st_union(geometry)) %>% nrow # prints 23 (correct answer) 
nrow(nc_DT[,st_union(geometry),by=SID74]) # prints 83 (incorrect answer) 

如果我们把它放在一个list,行数将是23

res <- nc_DT[, .(geom = st_union(geometry)),by=SID74] 
nrow(res) 
#[1] 23 
+0

然而,GEOM列的属性会被丢弃,使之成为一个无效的对象;尝试例如'plot(res $ geom)'。 –

+0

感谢您指出@EdzerPebesma。 geom列应该保留哪些属性? AFAICT它应该是'class',它应该具有'c(“XY”,“MULTIPOLYGON”,“sfg”)'的值。这是一个问题(在两个项目的问题页面上提到),需要解决这个问题才能使'data.table'和'sf'协同工作。 – Vijay