为什么科幻对象无法在R中使用所有data.table方法?

问题描述

我正在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