data.table переключает имена столбцов

#r #data.table

#r #data.table

Вопрос:

Я хотел бы спросить, является ли следующее поведение data.table функцией или ошибкой.

Учитывая data.table

 dt = data.table(
  group = c(rep('group1',5),rep('group2',5)),
  x = as.numeric(c(1:5, 1:5)),
  y = as.numeric(c(5:1, 5:1)),
  z = as.numeric(c(1,2,3,2,1, 1,2,3,2,1))
)
 

и вектор имен столбцов, содержащий дубликат,

 cols = c('y','x','y','z') # contains a duplicate column name
 

data.table справедливо мешает мне присваивать значения повторяющимся именам столбцов:

 dt[,(cols) := lapply(.SD,identity), .SDcols=cols] # Error (OK)
 

Мне это кажется подходящим поведением, потому что это может помочь избежать непредвиденных последствий. Однако, если я выполняю одно и то же назначение по группам,

 dt[,(cols) := lapply(.SD,identity), .SDcols=cols, by=group] # No error!
 

затем data.table не выдает ошибку. Назначение выполняется, и можно проверить, что столбцы y и z были заменены.

Это произошло со мной в большом приложении при унизительном разбиении переменных по группам, и было трудно отследить источник такого поведения. Рекомендация для пользователя, конечно, заключается в том, чтобы избегать повторяющихся имен столбцов при назначении и избегать предоставления повторяющихся имен .SDcols . Однако, не было бы лучше data.table выдать ошибку в этой ситуации?

Комментарии:

1. Звучит как сообщение об ошибке .

Ответ №1:

Это ошибка, которая была исправлена в версии 1.12.4 data.table . Вот сообщение об ошибке: https://github.com/Rdatatable/data.table/issues/4874 .

Другие пользователи с этой проблемой могут просто обновить версию своего пакета, например, используя install.packages('data.table') . Чтобы проверить текущую версию пакета, загрузите data.table , а затем просмотрите выходные sessionInfo() данные .

Но было бы разумно избегать предоставления повторяющихся имен столбцов .SDcols .