У меня есть следующий DT (data.table) в R.
dt <- fread("
id| rowids | charge | payment | balance
a | 1 | 7.1 | 0 |
a | 2 | 1.2 | 3 |
a | 3 | 1.7 | 1 |
b | 1 | 8.1 | 0 |
b | 2 | 2.5 | 4 |
b | 3 | 2.3 | 2 |
b | 4 | 3.2 | 1 |
",
sep = "|",
colClasses = c("character", "numeric", "numeric", "numeric",
"numeric"))
"Баланс" должен быть вычислен внутри каждой группы идентификаторов как "баланс <- предыдущий.row.balance + обвинение- оплата ", где" previous.row.balance "- предыдущая запись строки" balance ". </p>
Я изначально недооцениваю сложность вычисления баланса бега. Я думал о dt[,previous.row.balance := (shift(balance,1),by=id]
. Но R делает векторизованные вычисления. У меня не было значений в «balance», доступных для выполнения shift (), так как «balance» будет вычисляться через итерацию строка за строкой.
Я искал в StackOverflow и нашел аналогичный вопроси его первый ответ очень помог мне продумать весь процесс. Я адаптировал код в первом ответе к своей проблеме и получил следующий код, работающий чудесно, чтобы сгенерировать текущий баланс по группам.
dt[rowids == 1, balance := charge, by=.(id)]
dt[rowids != 1, balance :=
dt[,
{
balance1 <- balance[1L]
.SD[rowids != 1,
{balance1 <- balance1 + charge - payment
.(balance1)
},
by=.(rowids)]
},
by=.(id)][, -1L:-2L]
]
Вот мои вопросы.
- Iдо сих пор не могу понять, как
by=.(id)][, -1L:-2L]
, цепочка скобок отработала итерацию. Поскольку в коде не используется shift() by = group
, я думаю, [, -1L:-2L]
выполняет эту задачу для выполнения итерации. Но как? Что [, -1L:-2L]
на самом деле делает здесь?
Извините, что я должен задать этот вопрос здесь, вместо того, чтобы комментировать или задавать под этот вопрос . Причина в том, что я новичок в StackOverflow только с 1 очком репутации. Мне не разрешено комментировать первоначальный ответ на этот вопрос. Я также хотел бы проголосовать за этот ответ. Прежде чем я смогу это сделать, я должен заработать больше очков.
Есть ли другой способ: использовать data.table и R векторизованное вычисление для достижения этой цели текущего баланса, не заключая ни одной петли для итерации строки?
Любое понимание или мысль приветствуются!