Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

r

data.table

r-sf

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?

like image 601
Qi Yin Avatar asked Nov 22 '25 06:11

Qi Yin


1 Answers

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

like image 179
DJJ Avatar answered Nov 23 '25 19:11

DJJ



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!