Рассчитайте несколько столбцов, работая с несколькими другими столбцами в одной и той же таблице данных. - PullRequest
0 голосов
/ 08 июня 2018

Я ищу способ умножить несколько столбцов таблицы данных (DT) на несколько других столбцов в одном и том же DT.В другом посте речь шла о способе умножения многих столбцов на определенный столбец в том же DT Умножение многих столбцов на конкретный другой столбец в R с data.table? .Мой вопрос расширяет этот предыдущий вопрос.

Начиная с этого DT:

DT <- data.table(x1 = 1:5L, y1 = 6:10L, x2 = 11:15L, y2 = 16:20L)

   x1 y1 x2 y2
1:  1  6 11 16
2:  2  7 12 17
3:  3  8 13 18
4:  4  9 14 19
5:  5 10 15 20

Я хочу умножить z1 = x1 * y1 и z2 = x2 * y2, чтобы получить

   x1 y1 x2 y2 z1  z2
1:  1  6 11 16  6 176
2:  2  7 12 17 14 204
3:  3  8 13 18 24 234
4:  4  9 14 19 36 266
5:  5 10 15 20 50 300

Вот способ грубой силы построить желаемый DT:

DT2[, ':='(z1 = x1 * y1, z2 = x2 * y2]

Конечно, должен быть элегантный способ сделать это.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Возможно, дело вкуса, но вы могли бы использовать Map и создать несколько списков для его подачи.

DT[, c("z1", "z2") := Map("*", list(x1, x2), list(y1, y2))]

Расширение до многих переменных в сочетании с mget и ls, do

DT[, c("z1", "z2") := Map("*", mget(ls(pattern="x")), mget(ls(pattern="y")))]

Оба они возвращают желаемый результат

DT
   x1 y1 x2 y2 z1  z2
1:  1  6 11 16  6 176
2:  2  7 12 17 14 204
3:  3  8 13 18 24 234
4:  4  9 14 19 36 266
5:  5 10 15 20 50 300

Я просто упомяну, что mget и ls с шаблонами могут использоваться для возврата списков объектов, которые существуют вконкретная среда.ls ищет родительскую среду по умолчанию, которая является средой таблицы данных, в которой она была вызвана.Поэтому в случае, если у вас есть объект с именем x3, который существует вне data.table, вам не нужно беспокоиться: этот объект игнорируется.

0 голосов
/ 08 июня 2018

Я нашел этот ответ R data.table вычисляет новые столбцы в laply путем поиска по тегам "data.table" + "computing-columns".В общем, ответ на мой вопрос будет следующим:

DT <- data.table(x1 = 1:5L, y1 = 6:10L, x2 = 11:15L, y2 = 16:20L)
FUN <- function(ndx, DT) {DT[, paste("z", ndx, sep = "") := get(paste("x", ndx, sep = "")) *  get(paste("y", ndx, sep = ""))]}
lapply(1:2, FUN, DT)

DT
x1 y1 x2 y2 z1  z2
1:  1  6 11 16  6 176
2:  2  7 12 17 14 204
3:  3  8 13 18 24 234
4:  4  9 14 19 36 266
5:  5 10 15 20 50 300

Хотя это, очевидно, ответ, возможно, понятно, как я не смог его найти, потому что думаю, что в названии отсутствует конкретность.Тем не менее, есть ли более простой способ подойти к вопросу, поднятому здесь?

...