Использование функции «shift» в R для вычитания одной строки из другой по группе - PullRequest
0 голосов
/ 21 мая 2018

У меня есть data.table, который выглядит следующим образом:

dt
   id month balance
1:  1     4     100
2:  1     5      50
3:  2     4     200
4:  2     5     135
5:  3     4     100
6:  3     5     100
7:  4     5     300

«id» - это идентификатор клиента, «month» указывает, какой это месяц, а «balance» указывает остаток на счетеклиент.В некотором смысле это продольные данные, где, скажем, элемент (2,3) указывает, что у Клиента # 1 на конец месяца 5 остаток на счете 50.

Я хочу создать столбец, который будетдайте мне разницу между балансом клиента между 5 и 4 месяцами, чтобы узнать о транзакциях, совершаемых с одного месяца в другой.

Эта новая переменная должна сообщить мне, что Клиент 1 привлек 50, Клиент 2 привлек 65 и Клиент3 не делали ничего в совокупном выражении с апреля по май.Клиент 4 - это новый клиент, который присоединился к маю.

Я подумал о следующем коде:

dt$transactions <- dt$balance - shift(dt$balance, 1, "up")

Однако он не работает должным образом, поскольку сообщает, что Клиент 4 заработал 200долларовый депозит (но Клиент 4 новый!).Поэтому я хочу как-то ввести аргумент «by = id».

Я знаю, что решение заключается в использовании следующих обозначений:

dt[, transactions := balance - shift(balance, ??? ), by=id]

Мне просто нужновыяснить, как заставить вышеупомянутый код работать должным образом.

Заранее спасибо.

1 Ответ

0 голосов
/ 21 мая 2018

Учитывая, что у меня есть только два наблюдения (самое большее), следующий код дает мне элегантное решение:

dt[, transaction := balance - first(balance), by = id]

Это предотвращает ввод любых NA в переменную транзакция .

Однако, если бы у меня было больше наблюдений за идентификатором, я бы сделал следующее:

dt[,transaction := balance - shift(balance,1), by = id]

Большое спасибо @Ryan и @Onyambu за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...