我一直在积极寻找R中问题的解决方案,但没有找到解决我问题的方法...
我有一份使用pepe模因数据的R报告要在1月初提交。我一直在研究pepe模因的价格,这是我的问题。我的日期格式为yyyy-mm-dd h:m
,我想将这些日期汇总成月度数据。我当时正在考虑首先制作一个新文件,其时间戳的格式为yyyy-mm
,但我无法做到这一点。转换为yyyy-mm-dd
格式时很成功,但是当我想使用yyyy-mm格式时确实遇到了问题。
因此,更清楚地说,这是我的两个问题:
如何将我的yyyy-mm-dd h:m
日期与每月数据的平均值(以yyyy-mm
格式汇总为每月日期)?
如果您不知道如何直接汇总日期,那么您是否有人知道如何从yyyy-mm-dd h:m
格式转换为yyyy-mm
格式?
这是我的数据集的一些行(只是一个摘要,它包含250多个行):
Timestamp ForwardQuantity TotalPriceUSDPerUnit
------------------------------------------------------------
1 2016-09-26 04:00:00 3 3.44
2 2016-09-26 04:00:00 7 3.44
3 2016-09-26 05:00:00 3 3.39
4 2016-09-26 05:00:00 1 3.39
5 2016-09-26 06:00:00 2 3.39
6 2016-09-26 13:00:00 4 2.84
7 2016-09-28 04:00:00 1 2.88
8 2016-09-28 04:00:00 1 2.92
9 2016-09-28 06:00:00 1 2.92
10 2016-09-28 06:00:00 1 2.92
在此先感谢您,并为那些庆祝圣诞节的人们度过一个愉快的圣诞节!
编辑:预期结果:
Timestamp Average price
------------------------------------
1 2016-09 2.9981
在这里,平均价格是通过将上述远期数量乘以其相关价格而获得的
编辑2:dput(head(DatasHAIRPEPE3col,10))的输出如下
structure(list(Timestamp = structure(c(1474862400, 1474862400,
1474866000, 1474866000, 1474869600, 1474894800, 1475035200, 1475035200,
1475042400, 1475042400), class = c("POSIXct", "POSIXt"), tzone = "UTC"),
ForwardQuantity = c(3L, 7L, 3L, 1L, 2L, 4L, 1L, 1L, 1L, 1L
), TotalPriceUSDPerUnit = c(3.445, 3.445, 3.392, 3.392, 3.392,
2.8352, 2.8795, 2.9238, 2.9238, 2.9238)), row.names = c(NA,
-10L), class = c("tbl_df", "tbl", "data.frame"))
答案 0 :(得分:1)
使用末尾注释中可重复显示的数据
1)动物园将数据转换为动物园对象,并同时将其聚合为yearmon
类。这将使动物园对象Mean
每年/每月平均一次。您可以使用它,也可以使用fortify.zoo
将其转换为data.frame。此解决方案可能比下面的(2)更为方便,因为我们将年/月直接表示为yearmon
类对象,可以按逻辑方式对其进行绘制和操作。
library(zoo)
Mean <- read.zoo(DF, FUN = as.yearmon, aggregate = mean)
fortify.zoo(Mean) # optional
提供此数据框:
Index Mean
1 Sep 2016 3.406667
您现在可以进一步操作,例如使用plot.zoo
进行绘制,如下所示:
plot(Mean)
2)基数R 或者,使用每个时间戳的前7个字符表示年/月,并以此为依据。
DF2 <- transform(DF, Timestamp = substring(Timestamp, 1, 7))
aggregate(UsdPricePerUnit ~ Timestamp, DF2, mean)
给予:
Timestamp UsdPricePerUnit
1 2016-09 3.406667
Lines <- "
Timestamp UsdPricePerUnit
2016-09-26 04:00:00 3.44
2016-09-26 04:00:00 3.44
2016-09-26 05:00:00 3.39
2016-09-26 05:00:00 3.39
2016-09-26 05:00:00 3.39
2016-09-26 06:00:00 3.39"
DF <- read.csv(textConnection(gsub(" +", ",", Lines)))
答案 1 :(得分:1)
使用上一个答案中提供的示例数据(另外增加一个月用于演示)以及dplyr
和anytime
library(tidyverse)
library(anytime)
Lines <- "
Timestamp ForwardQuantity UsdPricePerUnit
2016-09-26 04:00:00 3 3.44
2016-09-26 04:00:00 7 3.44
2016-09-26 05:00:00 3 3.39
2016-10-26 05:00:00 1 3.39
2016-10-26 05:00:00 2 3.39
2016-10-26 06:00:00 4 3.39"
DF <- read.csv(textConnection(gsub(" +", ",", Lines)))
DF %>%
mutate(month = format(anydate((Timestamp)), "%Y-%m")) %>%
group_by(month) %>%
mutate(MonthlySpend = ForwardQuantity*UsdPricePerUnit) %>%
summarise(QuanPerMon = sum(ForwardQuantity),
SpendPerMon = sum(MonthlySpend)) %>%
mutate(AveragePrice = SpendPerMon/QuanPerMon) %>%
select(1,4)
# A tibble: 2 x 2
month AveragePrice
<chr> <dbl>
1 2016-09 3.43
2 2016-10 3.39
编辑-向问题中添加了新数据
这对我来说对你的数据有用
df %>%
mutate(month = format(anydate((Timestamp)), "%Y-%m")) %>%
group_by(month) %>%
mutate(MonthlySpend = ForwardQuantity*TotalPriceUSDPerUnit) %>%
summarise(QuanPerMon = sum(ForwardQuantity),
SpendPerMon = sum(MonthlySpend)) %>%
mutate(AveragePrice = SpendPerMon/QuanPerMon) %>%
select(1,4)
# A tibble: 1 x 2
month AveragePrice
<chr> <dbl>
1 2016-09 3.24