Це питання є розширенням на основі як отримати швидкий підсумок підрахунку в.
Подібним чином, це частина інженерії функцій, яка узагальнює кожен ідентифікатор залежно від стовпця, який називається 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[, `:=`()]