Qi Yin
Qi Yin

Reputation: 159

why cannot sf object use all data.table methods in R?

I am learning sf in R. Since I like data.table very much, I though I could use both. However, it seems that sf object deriving from data.table cannot use methods in data.table any more. Following is an example:

First I generate a very simple data.table and make it to a sf object. So far so good.

> 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"))

Then I check the structure of the my_sf. It is an sf object, a data.table and a 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"

Then I tried some arbitary function unique, and it does not work. Actually this my_sf does not work as data.table at all.

> my_sf[, unique(id)]
Error in unique(id) : object 'id' not found

Does anyone know the reason for it? Is it not possible to use data.table for sf?

Upvotes: 4

Views: 922

Answers (1)

DJJ
DJJ

Reputation: 2549

My guess is the function st_as_sf has destroyed .internal.selfref attribute turning back the data.table into data.frame although the class name has been preserved.

> 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) might be enough to turn back the data.frame into a data.table

Upvotes: 1

Related Questions