我的数据如下所示,不同的node_desc每周有4年的数据
ID1 ID2 DATE_ value
1: 00001 436 2014-06-29 175.8164
2: 00001 436 2014-07-06 188.9264
3: 00001 436 2014-07-13 167.5376
4: 00001 436 2014-07-20 160.7907
5: 00001 436 2014-07-27 185.3018
6: 00001 436 2014-08-03 179.5748
想将数据帧转换为每月数据。尝试以下代码
df %>%
tq_transmute(select = c(value,ID1),
mutate_fun = apply.monthly,
FUN = mean)
但是我的输出如下所示
DATE_ value
<dttm> <dbl>
1 2014-06-29 00:00:00 144.
2 2014-07-27 00:00:00 143.
3 2014-08-31 00:00:00 143.
4 2014-09-28 00:00:00 152.
5 2014-10-26 00:00:00 156.
6 2014-11-30 00:00:00 166.
但是我想拥有ID1,ID2,Date(每月)和值(获取4周的平均值或最大值),而不是仅仅具有日期和值,因为我有4年不同ID1的数据。有人用R帮助我
答案 0 :(得分:0)
这是我的主意
dta <- data.frame(id1=rep("00001",6),id2=rep("436",6),
date_=as.Date(c("29jun2014","6jul2014","13jul2014","20jul2014","27jul2014","3aug2014"),"%d%B%Y"),
value=c(175.8164,188.9264,167.5376,160.7907,185.3018,179.5748))
剩下的事情由dplyr
完成。在这里,我通过取平均值来总结数据
library(dplyr)
my_dta <- dta %>% mutate(month_=format(as.yearmon(date_),"%b"))
my_dta %>% group_by(.dots=c("id1","id2")) %>% summarise(mvalue=mean(value))
答案 1 :(得分:0)
您遇到的问题是您的数据集没有每日数据。 apply.monthly
函数来自xts,但是tidyquant围绕许多函数使用包装器,因此它们以更整齐的方式工作。 apply.monthly
需要一个xts对象,该对象基本上是具有时间索引的矩阵。
还知道apply.monthly返回时间序列中该月的最后一个可用日期。查看您的示例集,它在2017年7月返回的最后一天是27日。现在,如果您一个月中有5条记录(几周),则均值函数将在5条记录中执行此操作。绝对不会是1个月,因为每周数据永远不会覆盖每月数据。
但是使用tidyquant,如果将结果与原始数据结合在一起,则可以得到ID1和ID2的每月结果。请参见下面的代码。我还没有删除任何不需要的列。
df1 %>%
tq_transmute(select = c(value, ID1),
mutate_fun = apply.monthly,
FUN = mean) %>%
mutate(DATE_ = as.Date(DATE_)) %>%
inner_join(df1, by = "DATE_")
# A tibble: 3 x 5
DATE_ value.x ID1 ID2 value.y
<date> <dbl> <fct> <fct> <dbl>
1 2014-06-29 176. 00001 436 176.
2 2014-07-27 176. 00001 436 185.
3 2014-08-03 180. 00001 436 180.
数据:
df1 <- data.frame(ID1 = rep("00001", 6),
ID2 = rep("436", 6),
DATE_ = as.Date(c("2014-06-29", "2014-07-06", "2014-07-13", "2014-07-20", "2014-07-27", "2014-08-03")),
value = c(175.8164,188.9264,167.5376,160.7907,185.3018,179.5748)
)