在 R 中根据每一天的每一组取平均值
Take mean based on each group for each day in R
我有一个包含 return 个加密货币值的数据框,每个数据框根据价格分为一组 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 日的日期(如果当时不存在代币,则某些值不可用,例如 2014 年的以太坊)。
我想做的是创建一个 table 来获取每一天的每个组的平均值,所以
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)
我试图查找并找到 Aggregate / summarize multiple variables per group (e.g. sum, mean)
我尝试的是:
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")]
但这无法读取日期
关于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
我有一个包含 return 个加密货币值的数据框,每个数据框根据价格分为一组 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 日的日期(如果当时不存在代币,则某些值不可用,例如 2014 年的以太坊)。
我想做的是创建一个 table 来获取每一天的每个组的平均值,所以
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)
我试图查找并找到 Aggregate / summarize multiple variables per group (e.g. sum, mean) 我尝试的是:
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")]
但这无法读取日期
关于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