问题描述
我正在R中学习sf。由于我非常喜欢data.table,因此我可以同时使用两者。但是,似乎从data.table派生的SF对象无法再使用data.table中的方法。以下是一个示例:
首先,我生成一个非常简单的data.table
并将其创建为sf
对象。到目前为止一切顺利。
> dfr <- data.table(id = c("hwy1","hwy2"),+ cars_per_hour = c(78,22),+ lat = c(1,2),+ lon = c(3,4))
> my_sf <- st_as_sf(dfr,coords = c("lon","lat"))
然后,我检查my_sf
的结构。它是一个sf
对象,一个data.table
和一个data.frame
。
> str(my_sf)
Classes ‘sf’,‘data.table’ and 'data.frame': 2 obs. of 3 variables:
$ id : chr "hwy1" "hwy2"
$ cars_per_hour: num 78 22
$ geometry :sfc_POINT of length 2; first list element: 'XY' num 3 1
- attr(*,"sf_column")= chr "geometry"
- attr(*,"agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA
..- attr(*,"names")= chr "id" "cars_per_hour"
然后,我尝试了一些任意功能unique
,但它不起作用。实际上,这个my_sf
根本不能用作data.table。
> my_sf[,unique(id)]
Error in unique(id) : object 'id' not found
有人知道原因吗? data.table
不能使用sf
吗?
解决方法
我的猜测是函数st_as_sf
破坏了.internal.selfref属性,尽管保留了类名,但仍将data.table转换回data.frame
。
> str(dfr)
#Classes ‘data.table’ and 'data.frame': 2 obs. of 4 variables:
#$ id : chr "hwy1" "hwy2"
#$ cars_per_hour: num 78 22
#$ lat : num 1 2
#$ lon : num 3 4
#- attr(*,".internal.selfref")=<externalptr>
setDT(my_sf)
可能足以将data.frame变回data.table