R для циклов, создающих таблицу данных - PullRequest
0 голосов
/ 06 апреля 2020

мои данные структурированы следующим образом:

        price machine           timestamp       date hour   weekday month year                 trans_id
     1:   3.1     179 2017-01-11 15:53:58 2017-01-11   15 Wednesday     1 2017  2017-01-11 15:53:58,179
     2:   3.1     179 2017-01-11 15:53:45 2017-01-11   15 Wednesday     1 2017  2017-01-11 15:53:45,179
     3:   3.1     179 2017-01-28 00:31:20 2017-01-28    0  Saturday     1 2017  2017-01-28 00:31:20,179
     4:   3.1     179 2017-02-04 02:08:42 2017-02-04    2  Saturday     2 2017  2017-02-04 02:08:42,179
     5:   3.1     179 2017-03-03 06:34:04 2017-03-03    6    Friday     3 2017  2017-03-03 06:34:04,179
    ---                                                                                                
1840473:   2.3    2707 2017-04-01 17:06:42 2017-04-01   17  Saturday     4 2017 2017-04-01 17:06:42,2707
1840474:   2.3    2707 2017-04-01 07:55:11 2017-04-01    7  Saturday     4 2017 2017-04-01 07:55:11,2707
1840475:   2.3    2709 2017-02-19 00:28:08 2017-02-19    0    Sunday     2 2017 2017-02-19 00:28:08,2709
1840476:   2.3    2709 2017-03-19 07:34:21 2017-03-19    7    Sunday     3 2017 2017-03-19 07:34:21,2709
1840477:   2.3    2709 2017-03-29 05:56:19 2017-03-29    5 Wednesday     3 2017 2017-03-29 05:56:19,2709

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

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

ex=dt_2017[(machine=='179')&(date=='2017-01-11')]

total_hours=ex[,unique(hour)]
total_day_transaction=nrow(ex)
average_hour_transaction=total_day_transaction/length(total_hours)

change_hour=vector(mode='list')

counterk=1
for (k in total_hours){
 hour_transac=nrow(ex[hour==k])
 change=(hour_transac-average_hour_transaction)/average_hour_transaction
 change_hour[[counterk]]=change
 counterk=counterk+1
}


avg_matrix=cbind(as.data.frame(total_hours),transpose(as.data.frame(change_hour)))

ex2=setDT(merge(x=ex,
               y=avg_matrix,
               by.x='hour',
               by.y='total_hours'))

colnames(ex2)[ncol(ex2)]<-'hour_change'

trans_id=ex2[,trans_id]
dyna_price=vector(mode='list')
counterl=1
for (l in trans_id){
 if (ex2[trans_id==l,hour_change]>0){
   dyna_price[counterl]=ex2[trans_id==l,price]*(1+ex2[trans_id==l,hour_change])
 }else{
   dyna_price[counterl]=ex2[trans_id==l,price]
 }
 counterl=counterl+1

}

dyna_price_matrix=cbind(as.data.frame(trans_id),transpose(as.data.frame(dyna_price)))
ex3=merge(x=dt_2017,
         y=dyna_price_matrix,
         by='trans_id',
         all.x=TRUE)

colnames(ex3)[ncol(ex3)]<-'dynamic_price'

Однако я хотел бы повторить это на каждой машине и каждый день. Я верю, что мне нужно найти способ присвоения моей таблице данных переменной, но я не могу найти ничего в Интернете. Любая помощь приветствуется. Большое спасибо

1 Ответ

0 голосов
/ 06 апреля 2020

Мы можем использовать другую группу by= и назначать переменные с помощью :=. .N - это специальный символ, содержащий количество строк в группе.

library(data.table)
setDT(Data)[,hour.trans := .N, by = c("machine","date","hour")][
  ,daily.avg := .N / 24,by = c("machine","date")][
    ,difference := hour.trans - daily.avg, by = c("machine","date")][
      ,.(machine,date,hour,daily.avg,difference)]
#    machine       date hour  daily.avg difference
# 1:     179 2017-01-11   15 0.08333333 1.9166667
# 2:     179 2017-01-11   15 0.08333333 1.9166667
# 3:     179 2017-01-28    0 0.04166667 0.9583333
# 4:     179 2017-02-04    2 0.04166667 0.9583333
# 5:     179 2017-03-03    6 0.04166667 0.9583333
# 6:    2707 2017-04-01   17 0.08333333 0.9166667
# 7:    2707 2017-04-01    7 0.08333333 0.9166667
# 8:    2709 2017-02-19    0 0.04166667 0.9583333
# 9:    2709 2017-03-19    7 0.04166667 0.9583333
#10:    2709 2017-03-29    5 0.04166667 0.9583333

Данные

structure(list(price = c(3.1, 3.1, 3.1, 3.1, 3.1, 2.3, 2.3, 2.3, 
2.3, 2.3), machine = c(179L, 179L, 179L, 179L, 179L, 2707L, 2707L, 
2709L, 2709L, 2709L), timestamp = structure(c(2L, 1L, 3L, 4L, 
6L, 10L, 9L, 5L, 7L, 8L), .Label = c("2017-01-11 15:53:45", "2017-01-11 15:53:58", 
"2017-01-28 00:31:20", "2017-02-04 02:08:42", "2017-02-19 00:28:08", 
"2017-03-03 06:34:04", "2017-03-19 07:34:21", "2017-03-29 05:56:19", 
"2017-04-01 07:55:11", "2017-04-01 17:06:42"), class = "factor"), 
    date = structure(c(1L, 1L, 2L, 3L, 5L, 8L, 8L, 4L, 6L, 7L
    ), .Label = c("2017-01-11", "2017-01-28", "2017-02-04", "2017-02-19", 
    "2017-03-03", "2017-03-19", "2017-03-29", "2017-04-01"), class = "factor"), 
    hour = c(15L, 15L, 0L, 2L, 6L, 17L, 7L, 0L, 7L, 5L), weekday = structure(c(4L, 
    4L, 2L, 2L, 1L, 2L, 2L, 3L, 3L, 4L), .Label = c("Friday", 
    "Saturday", "Sunday", "Wednesday"), class = "factor"), month = c(1L, 
    1L, 1L, 2L, 3L, 4L, 4L, 2L, 3L, 3L), year = c(2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L), 
    trans_id = structure(c(2L, 1L, 3L, 4L, 6L, 10L, 9L, 5L, 7L, 
    8L), .Label = c("2017-01-11 15:53:45,179", "2017-01-11 15:53:58,179", 
    "2017-01-28 00:31:20,179", "2017-02-04 02:08:42,179", "2017-02-19 00:28:08,2709", 
    "2017-03-03 06:34:04,179", "2017-03-19 07:34:21,2709", "2017-03-29 05:56:19,2709", 
    "2017-04-01 07:55:11,2707", "2017-04-01 17:06:42,2707"), class = "factor")), class = "data.frame", row.names = c(NA, 
-10L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...