/ / Як отримати швидкий підсумок у data.table за допомогою вікна огляду? - r, data.table

Як отримати швидке резюме в data.table з вікном заднім? - r, data.table

Це питання є розширенням на основі як отримати швидкий підсумок підрахунку в.

Подібним чином, це частина інженерії функцій, яка узагальнює кожен ідентифікатор залежно від стовпця, який називається Col оглядаючись назад із певним часовим вікном. Така ж попередня обробка застосовуватиметься до набору тестування. Оскільки набір даних великий, рішення на основі data.table може бути більш кращим.

1. літній розмір змінної та значення із вікном огляду

Навчання:

ID   Time        Col   Count
A    2017-06-05   M      1
A    2017-06-02   M      1
A    2017-06-03   M      1
B    2017-06-02   K      1
B    2017-06-01   M      4

Застосувавши два дні, оглядаючись назад, ми маємо:

ID   Time          Time-2D   Col   Count
A    2017-06-05   2017-06-03   M      1   #Time-2D by moving time two days back
A    2017-06-02   2017-05-31   M      1
A    2017-06-03   2017-06-01   M      1
B    2017-06-02   2017-05-31   K      1
B    2017-06-01   2017-05-30   M      4

Очікуваний результат (кількість):

ID   Time          Time-2D   Col_M    Col_K
A    2017-06-05   2017-06-03   1      0     #from 2017-06-03 to 2017-06-05, for user A, there are 0 (sum(count)) of K and 1 (sum(count)) of M.
A    2017-06-02   2017-05-31   1      0
A    2017-06-03   2017-06-01   2      0     # 2 is because from 06-01 to 06-03, there is two rows in the first table (A    2017-06-02   M      1; A    2017-06-03   M      1) that the count summarization on M is 2.
B    2017-06-02   2017-05-31   0      1
B    2017-06-01   2017-05-30   4      0

2. Обчислити коефіцієнт

Виходячи з наведеної вище таблиці, Очікуваний вихід (співвідношення):

ID   Time          Time-2D   Col_M    Col_K
A    2017-06-05   2017-06-03   1      0     # 1/sum(1+0)
A    2017-06-02   2017-05-31   1      0
A    2017-06-03   2017-06-01   1      0     #2/sum(2+0)
B    2017-06-02   2017-05-31   0      1
B    2017-06-01   2017-05-30   1      0     # 4/sum(4+0)

Вище для обробки навчальних даних. Для тестування набору даних, якщо потрібно зіставити Col_M, Col_K, тобто, якщо інше значення, як S, що з'являється в Col, воно буде проігноровано.

Відповіді:

1 для відповіді № 1

Думаю, я розумію ваше прохання. Здається, ви дбаєте про порядок спостережень незалежно від того, чи, наприклад, це друге спостереження Time до перших спостережень Time. Це не має великого сенсу, але для досягнення цього є ефективне рішення data.table, яке виходить із цього. Це, в основному, робить нееквіне приєднуйтесь до ID, Col, Обидва Time колони і індекс рядка (який в основному є порядком зовнішнього вигляду). Згодом це просто dcast перетворити з довгого в широкий (як у попередньому запитанні). Зверніть увагу, що результат упорядковується за датами, але я зберегла rowindx змінної, так що ви можете змінити порядок її назад за допомогою setorder. Крім того, я зберігатиму відношення calc до вас, оскільки це дуже базове (підказка - Дон т використовуйте петлі, це повністю векторизований один вкладиш)

library(data.table) #v1.10.4+

## Read the data
DT <- fread("ID   Time        Col   Count
A    2017-06-05   M      1
A    2017-06-02   M      1
A    2017-06-03   M      1
B    2017-06-02   K      1
B    2017-06-01   M      4")

## Prepare the variables we need for the join
DT[, Time := as.IDate(Time)]
DT[, Time_2D := Time - 2L]
DT[, rowindx := .I]

## Non-equi join, sum `Count` by each join
DT2 <- DT[DT,
sum(Count),
on = .(ID, Col, rowindx <= rowindx, Time <= Time, Time >= Time_2D),
by = .EACHI]

## Fix column names (a known issue)
setnames(DT2, make.unique(names(DT2)))

## Long to wide (You can reorder back using `rowindx` and `setorder` function)
dcast(DT2, ID + Time + Time.1 + rowindx ~ Col, value.var = "V1", fill = 0)
#    ID       Time     Time.1 rowindx K M
# 1:  A 2017-06-02 2017-05-31       2 0 1
# 2:  A 2017-06-03 2017-06-01       3 0 2
# 3:  A 2017-06-05 2017-06-03       1 0 1
# 4:  B 2017-06-01 2017-05-30       5 0 4
# 5:  B 2017-06-02 2017-05-31       4 1 0

1 для відповіді № 2

Ви можете спробувати

dt <- fread("ID   Time          Time-2D   Col   Count
A    2017-06-05   2017-06-03   M      1
A    2017-06-02   2017-05-31   M      1
A    2017-06-03   2017-06-01   M      1
B    2017-06-02   2017-05-31   K      1
B    2017-06-01   2017-05-30   M      4")
dt1 <- dcast(dt, ID+Time+`Time-2D`~Col, value.var = c("Count"))
dt1[, K := ifelse(is.na(K), 0, K)]
dt1[, M := ifelse(is.na(M), 0, M)]

ID       Time    Time-2D K M
1:  A 2017-06-02 2017-05-31 0 1
2:  A 2017-06-03 2017-06-01 0 1
3:  A 2017-06-05 2017-06-03 0 1
4:  B 2017-06-01 2017-05-30 0 4
5:  B 2017-06-02 2017-05-31 1 0

dt1[, Col_K := K/(K+M)]
dt1[, Col_M := M/(K+M)]

ID       Time    Time-2D K M Col_K Col_M
1:  A 2017-06-02 2017-05-31 0 1     0     1
2:  A 2017-06-03 2017-06-01 0 1     0     1
3:  A 2017-06-05 2017-06-03 0 1     0     1
4:  B 2017-06-01 2017-05-30 0 4     0     1
5:  B 2017-06-02 2017-05-31 1 0     1     0

Можливо, ви можете поєднати останні 2 рядки. щось на зразок

dt1[, `:=`()]