Добавить новую переменную (стандартное отклонение) в `df1` для зависимости строки от нескольких строк из` df2` и обусловить ее значением `Datetime` и двумя другими переменными - PullRequest
1 голос
/ 24 мая 2019

У меня есть фрейм данных df1, который суммирует разных людей df$Person с интервалом в один час df1$DateTime с течением времени.

Кроме того, у меня есть еще один фрейм данных df2, в столбце Data_Type которого содержится информация о том, что эти люди делали с течением времени в отношении «времени, потраченного на телефон» или «денег, потраченных на покупки». В столбце Value отображаются либо минуты, потраченные по телефону, либо деньги, потраченные на это конкретное время.

Как пример:

df1<- data.frame(DateTime=c("2016-09-27 11:00:00","2016-09-27 11:00:00","2016-09-27 12:00:00","2016-09-27 12:00:00","2016-09-27 13:00:00","2016-09-27 13:00:00"),
                 Person= c(11,12,11,12,11,12))

df2<- data.frame(DateTime= c("2016-09-27 11:03:40","2016-09-27 11:07:40","2016-09-27 11:34:53","2016-09-27 11:48:32","2016-09-27 12:01:40","2016-09-27 12:09:40","2016-09-27 12:21:40","2016-09-27 12:29:40","2016-09-27 12:35:40","2016-09-27 12:41:40","2016-09-27 12:53:26","2016-09-27 13:05:40","2016-09-27 13:24:14","2016-09-27 13:32:50","2016-09-27 13:47:19"),
                 Person= c(11,11,12,11,12,11,11,11,11,12,12,12,11,12,11),
                 Data_Type=c("Call","Call","Call","Call","Purchase","Call","Call","Call","Call","Purchase","Call","Call","Call","Call","Purchase"),
                 Value=c(2.7,5.4,3.2,1.7,300,4.6,2.3,5.1,2.9,100,0.6,6.2,1.8,7.6,380))

> df1
             DateTime Person
1 2016-09-27 11:00:00     11
2 2016-09-27 11:00:00     12
3 2016-09-27 12:00:00     11
4 2016-09-27 12:00:00     12
5 2016-09-27 13:00:00     11
6 2016-09-27 13:00:00     12

> df2
              DateTime Person Data_Type Value
1  2016-09-27 11:03:40     11      Call   2.7
2  2016-09-27 11:07:40     11      Call   5.4
3  2016-09-27 11:34:53     12      Call   3.2
4  2016-09-27 11:48:32     11      Call   1.7
5  2016-09-27 12:01:40     12  Purchase 300.0
6  2016-09-27 12:09:40     11      Call   4.6
7  2016-09-27 12:21:40     11      Call   2.3
8  2016-09-27 12:29:40     11      Call   5.1
9  2016-09-27 12:35:40     11      Call   2.9
10 2016-09-27 12:41:40     12  Purchase 100.0
11 2016-09-27 12:53:26     12      Call   0.6
12 2016-09-27 13:05:40     12      Call   6.2
13 2016-09-27 13:24:14     11      Call   1.8
14 2016-09-27 13:32:50     12      Call   7.6
15 2016-09-27 13:47:19     11  Purchase 380.0

Я хочу добавить две новые переменные в df1, которые суммируют стандартное отклонение для Calls и Purchases в зависимости от человека и для указанных интервалов в один час.

Я бы хотел получить это (возможно, я сделал какую-то ошибку при вычислении sd):

> df1
             DateTime Person   sdCalls sdPurchases
1 2016-09-27 11:00:00     11 1.9139836          NA
2 2016-09-27 11:00:00     12 0.0000000          NA
3 2016-09-27 12:00:00     11 1.3375973          NA
4 2016-09-27 12:00:00     12 0.0000000    141.4214
5 2016-09-27 13:00:00     11 0.0000000      0.0000
6 2016-09-27 13:00:00     12 0.9899495          NA

Кто-нибудь знает, как это сделать?

1 Ответ

1 голос
/ 24 мая 2019

Можно указать floor столбец «DateTime» во втором наборе данных и объединить on с «Person», «DateTime» подмножество «Value», которое соответствует «Call», «Purchase» in » Data_Type ', чтобы получить sd

library(lubridate)
library(data.table)
setDT(df1)[, DateTime := ymd_hms(DateTime)]
setDT(df2)[, dt_floor := floor_date(ymd_hms(DateTime), unit = "hour")]
df2[df1, .(sdsCalls = sd(Value[Data_Type == "Call"]), 
  sdPurchases = sd(Value[Data_Type == 'Purchase'])),
          on = .(Person, dt_floor = DateTime), by = .EACHI]
...