Переопределение data.table с помощью `on =` - PullRequest
2 голосов
/ 13 апреля 2020

При создании подэтапа,

длина RHS должна быть либо 1 (допустимы отдельные значения), либо точно соответствовать длине LHS,

в качестве сообщения об ошибке говорит, что правило не соблюдается.

Однако работает следующее:

tab.01 <- data.table( a = 1L:5L, b = 11L:15L )
tab.02 <- data.table( a = c(1L, 1L, 2L), x = c(11L, 12L, 22L) )

tab.01[ tab.02, x := i.x, on = "a"]
#    a  b  x
# 1: 1 11 12
# 2: 2 12 22
# 3: 3 13 NA
# 4: 4 14 NA
# 5: 5 15 NA

Столбец x функционально не зависит от столбца a. Тем не менее, выполняется присваивание, и, если мое предположение верно, назначается последний элемент подгруппы.

Можно ли изменить это поведение по умолчанию , например, выбрать первый элемент? Следующие испытания не работают:

  1. mult = "first" не действует.
  2. tab.01[ tab.02, x := first(i.x), on = "a" ] назначает значение 11L для всех совпадений.
  3. tab.01[ tab.02, x := first(i.x), on = "a", by = "a"] результаты в ошибке, потому что i.x больше не доступен (или любой другой столбец в i).
  4. tab.01[ tab.02, x := first(i.x), on = "a", by = .EACHI ] не вызывает ошибку, но и ничего не исправляет. Значения в группе переназначаются в порядке строк, поэтому последнее значение сохраняется.

Можно использовать версию tab.02 с функционально зависимыми столбцами:

tab.02[ , y := f_fd(x), by = "a" ] # e.g. f_fd <- data.table::first
tab.01[ tab.02, x := y, on = "a"]

Это самый краткий способ выполнить эту задачу?

1 Ответ

2 голосов
/ 13 апреля 2020

Я считаю, что нет встроенного метода специально для этого. Однако это обновление можно выполнить без изменения tab.02.

Вы можете создать подмножество

tab.01[tab.02[rowid(a) == 1], x := i.x, on = "a"][]
#    a  b  x
# 1: 1 11 11
# 2: 2 12 22
# 3: 3 13 NA
# 4: 4 14 NA
# 5: 5 15 NA

или заказать до присоединения

tab.01[tab.02[order(-x)], x := i.x, on = "a"][]
#    a  b  x
# 1: 1 11 11
# 2: 2 12 22
# 3: 3 13 NA
# 4: 4 14 NA
# 5: 5 15 NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...