我是一名编程学生,对于我正在研究的项目,我必须做的事情是计算int值向量的中值.我这样做只使用排序功能从STL和矢量成员函数,如.begin(),.end()和.size().
我也应该确保我找到矢量具有奇数个值或偶数个值的中位数.
我被困了,下面我已经把我的尝试包括在内了.那我哪里错了?如果您愿意给我一些指导或资源以便朝着正确的方向前进,我将不胜感激.
码:
int CalcMHWScore(const vector<int>& hWScores)
{
const int DIVISOR = 2;
double median;
sort(hWScores.begin(), hWScores.end());
if ((hWScores.size() % DIVISOR) == 0)
{
median = ((hWScores.begin() + hWScores.size()) + (hWScores.begin() + (hWScores.size() + 1))) / DIVISOR);
}
else
{
median = ((hWScores.begin() + hWScores.size()) / DIVISOR)
}
return median;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!!
是否有某种方式使用rollapply(从zoo包装或类似的东西)优化功能(rollmean,rollmedian等)来计算与基于时间窗口的滚动功能,而不是一个基于的若干意见?我想要的很简单:对于不规则时间序列中的每个元素,我想计算一个带有N天窗口的滚动函数.也就是说,窗口应包括当前观察前N天的所有观察结果.时间序列也可能包含重复项.
以下是一个例子.鉴于以下时间序列:
date value
1/11/2011 5
1/11/2011 4
1/11/2011 2
8/11/2011 1
13/11/2011 0
14/11/2011 0
15/11/2011 0
18/11/2011 1
21/11/2011 4
5/12/2011 3
Run Code Online (Sandbox Code Playgroud)
具有5天窗口的滚动中位数(右侧对齐)应导致以下计算:
> c(
median(c(5)),
median(c(5,4)),
median(c(5,4,2)),
median(c(1)),
median(c(1,0)),
median(c(0,0)),
median(c(0,0,0)),
median(c(0,0,0,1)),
median(c(1,4)),
median(c(3))
)
[1] 5.0 4.5 4.0 1.0 0.5 0.0 0.0 0.0 2.5 3.0
Run Code Online (Sandbox Code Playgroud)
我已经找到了一些解决方案,但它们通常很棘手,通常意味着很慢.我设法实现了自己的滚动函数计算.问题是,对于非常长的时间序列,中位数(rollmedian)的优化版本可以产生巨大的时间差,因为它考虑了窗口之间的重叠.我想避免重新实现它.我怀疑rollapply参数有一些技巧可以使它工作,但我无法弄明白.在此先感谢您的帮助.
我正在尝试为不规则的时间序列数据集提取有趣的统计数据,但很难找到适合该工作的正确工具.可以很容易地找到用于操作定期采样时间序列或基于索引的系列的工具,尽管我对我正在尝试解决的问题没有太多运气.
首先,可重现的数据集:
library(zoo)
set.seed(0)
nSamples <- 5000
vecDT <- rexp(nSamples, 3)
vecTimes <- cumsum(c(0,vecDT))
vecDrift <- c(0, rnorm(nSamples, mean = 1/nSamples, sd = 0.01))
vecVals <- cumsum(vecDrift)
vecZ <- zoo(vecVals, order.by = vecTimes)
rm(vecDT, vecDrift)
Run Code Online (Sandbox Code Playgroud)
假设时间以秒为单位.系列中有将近1700秒(仅为30分钟),在此vecZ期间有5001个参赛作品.(注意:我尝试使用xts,但xts似乎需要日期信息,而且当不相关时我宁愿不使用特定的日期.)
我的目标如下:
确定每个点前3分钟和3分钟后的值的索引.由于时间是连续的,我怀疑任何两点相距3分钟.我想要找到的是在给定点之前至少3分钟,至少3分钟之后的点,即类似下面的点(伪代码):
backIX(t, vecZ, tDelta) = min{ix in length(vecZ) : t - time(ix) < tDelta}
forwardIX(t, vecZ, tDelta) = min{ix in length(vecZ) : time(ix) - t > tDelta}
所以,3分钟,tDelta = 180.如果t=2500,则结果为forwardIX()3012(即时间(vecZ)[2500]为860.1462,时间(vecZ)[3012]为1040.403,或仅超过180秒),输出为backwardIX() …
我有一个不规则的时间序列(xtsin R),我想应用一些时间窗口.例如,给定如下的时间序列,我想计算每个离散的3小时窗口中有多少观察数,例如2009-09-22 00:00:00:
library(lubridate)
s <- xts(c("OK", "Fail", "Service", "OK", "Service", "OK"),
ymd_hms(c("2009-09-22 07:43:30", "2009-10-01 03:50:30",
"2009-10-01 08:45:00", "2009-10-01 09:48:15",
"2009-11-11 10:30:30", "2009-11-11 11:12:45")))
Run Code Online (Sandbox Code Playgroud)
我显然不能使用period.apply()或split()不这样做,因为那些会省略没有观察的时期,我不能给它一个开始时间.
我想要的简单计数问题的输出(当然,我的实际任务对于每个段都更复杂!)如果我一次聚合3天就会是这样的:
2009-09-22 1
2009-09-25 0
2009-09-28 0
2009-10-01 3
2009-10-04 0
2009-10-07 0
2009-10-10 0
2009-10-13 0
2009-10-16 0
2009-10-19 0
2009-10-22 0
2009-10-25 0
2009-10-28 0
2009-10-31 0
2009-11-03 0
2009-11-06 0
2009-11-09 2
Run Code Online (Sandbox Code Playgroud)
谢谢你的指导.