Возьмите среднее значение для каждой группы за каждый день в R - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть фрейм данных возвращаемых значений криптовалют, каждый из которых отсортирован в группу из 5 по цене (в фрейме данных содержится 1 847 012 записей)

2014-01-02  XRP         0.064041998     1
2014-01-02  Dogecoin    -0.220306670    1
2014-01-02  FLO         0.043457042     1
2014-01-02  CasinoCoin  -0.080614279    2
2014-01-02  Nxt         0.048375563     2
2014-01-02  Quark       0.004495892     2
2014-01-02  Feathercoin 0.218078384     3
2014-01-02  Diamond     0.052490183     3
2014-01-02  Unobtanium  -0.107420249    4
2014-01-02  Peercoin    0.263435789     4
2014-01-02  Primecoin   0.230874782     4
2014-01-02  Bitcoin     0.039387728     5
2014-01-02  Litecoin    0.045263780     5
2014-01-02  Namecoin    0.318292245     5
2014-01-02  Ethereum    NA              NA
  ...        ...           ...         ...
2014-01-03  XRP         -0.03900908     1
2014-01-03  Dogecoin    -0.15273525     1
2014-01-03  FLO         0.02397348      1
2014-01-03  CasinoCoin  0.05748349      2
  ...        ...           ...         ...

Дата увеличивается до 2019-12-31 (некоторые значения недоступны, если монета еще не существовала, например, Ethereum в 2014 году).

То, что я хочу сделать, - это создать таблицу, которая принимает среднее значение для каждой группы для каждого дня, поэтому

        2014-01-02         2014-01-03          2014-01-04     ...
1       mean(group 1)      mean(group 1)
2       mean(group 2)      mean(group 2)
3       mean(group 3)      mean(group 3)
4       mean(group 4)      mean(group 4)
5       mean(group 5)      mean(group 5)

Я попытался найти и найти Агрегировать / обобщить несколько переменных на группу (например, сумма, среднее) То, что я пробовал, было:

means = as.data.frame(aggregate(d$value, list(d$Group), mean, na.rm = TRUE)) 

Но это только для каждой группы, за все даты и дает мне 5 значений в целом, где мне нужно 5 значений каждый день

Group.1    x
1          -4.920999e-03
2          -3.372798e-03
3          -1.548296e-03
4          -5.959693e-05
5          6.303165e-04

Я также пытался использовать data.table

df3 <- setDT(d)[, lapply(.SD, mean), by=.(date, Group), .SDcols=c("date","Group")]

Но это не может прочитать даты

1 Ответ

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

Насчет подхода data.table, я думаю, что ваш SDcols не прав.

library(data.table)
setDT(d)
d[,date := as.Date(date)]
d[, lapply(.SD, mean, na.rm = TRUE), by= c("date","Group"), .SDcols=c("value")]

Если я правильно понял, вы хотите сгруппировать по date и group и применить среднее значение к столбцу value (при необходимости измените имя)

Это даст вам долго отформатированные данные. Если вы хотите широкоформатные данные, вы можете использовать dcast. Что-то в этом вкусе:

dcast(data_long, Group ~ date)

Пример

library(data.table)
d = data.table(date = as.Date(c("2014-01-02", "2014-01-03")),
               Group = c('XRP','bitcoin'),
                value = c(0.064041998, 1))

data_long <- d[, lapply(.SD, mean, na.rm = TRUE), by= c("date","Group"), .SDcols=c("value")]
data_long
         date   Group    value
1: 2014-01-02     XRP 0.064042
2: 2014-01-03 bitcoin 1.000000

И если вы хотите широкоформатные данные, вы делаете:

dcast(data_long, Group ~ date)
Group 2014-01-02 2014-01-03
1:     XRP   0.064042         NA
2: bitcoin         NA          1
...