Удалить метки / атрибуты столбца data.table (импортированные данные) - PullRequest
1 голос
/ 22 мая 2019

При таком элементарном приложении у меня возникают проблемы при удалении меток / атрибутов столбцов data.table из импортированных данных (SAS)

Мой data.table DT - это импорт из файла SAS. Не все столбцы имеют метки, а некоторые имеют две метки. Я не могу поделиться своими данными, поскольку они импортированы (поэтому я не могу их реплицировать), но вот частичная структура DT:

> str(DT)
Classes ‘data.table’ and 'data.frame':  96293709 obs. of  150 variables:
 $ Col1               : chr  "Y" "N" "N" "N" ...
  ..- attr(*, "label")= chr "some label, description goes on and on"
 $ Col2               : chr  "N" "N" "N" "Y" ...
  ..- attr(*, "label")= chr "some label 2, description goes on and on"
 $ Col3                    : Date, format: "1994-08-07" "1994-08-07" "1994-08-07" "1994-08-07" ...
 $ Col4                          : chr  "M" "M" "M" "M" ...
  ..- attr(*, "label")= chr "some label 3, description goes on and on"
  ..- attr(*, "format.sas")= chr "$"
 $ Col5                     : num  1e+07 1e+07 1e+07 1e+07 1e+07 ...
  ..- attr(*, "label")= chr "some label 4, description goes on and on"
 $ Col6                       : Date, format: "2000-01-01" "2005-03-10" "2013-06-01" "2015-06-01" ...

Я пытаюсь удалить все атрибуты, потому что, когда я использую определенные столбцы для создания новостных, эти атрибуты наследуются в новом столбце, что очень раздражает и нежелательно (мешает мне слиться с другой таблицей data.table без меток ). Я думал, что единственный способ предотвратить это - удалить атрибуты (метки) из исходных данных DT.

Я пытался

> setattr(DT, "label", NULL)
> setattr(DT, "format.sas", NULL)

и я не получаю ошибки. но ничего не происходит после того, как я попробую вышеупомянутое и проверим структуру, я получу то же самое, что и раньше. ярлыки / атрибуты не были удалены. что я тут не так делаю? Я знаю, что должен как-то использовать setattr, так как не хочу, чтобы копировался DT (он довольно большой)

1 Ответ

2 голосов
/ 22 мая 2019

Атрибуты хранятся для каждого столбца, а не для data.table в целом, я думаю. Проверьте attributes(DT) против lapply(DT, attributes) и посмотрите, так ли это. Вот пример, который, я думаю, повторяет то, что вы пытаетесь сделать:

DT <- data.table(a=1:3,b=2:4)
attr(DT$a, "label") <- "a label"
attr(DT$b, "label") <- "a label"
attr(DT$b, "sas format") <- "ddmmyy10."

str(DT)
#Classes ‘data.table’ and 'data.frame':  3 obs. of  2 variables:
# $ a: atomic  1 2 3
#  ..- attr(*, "label")= chr "a label"
# $ b: atomic  2 3 4
#  ..- attr(*, "label")= chr "a label"
#  ..- attr(*, "sas format")= chr "ddmmyy10."
# - attr(*, ".internal.selfref")=<externalptr> 

DT[, names(DT) := lapply(.SD, setattr, "label", NULL)]
DT[, names(DT) := lapply(.SD, setattr, "sas format", NULL)]

str(DT)
#Classes ‘data.table’ and 'data.frame':  3 obs. of  2 variables:
# $ a: int  1 2 3
# $ b: int  2 3 4
# - attr(*, ".internal.selfref")=<externalptr> 
...