首先道歉,如果已经回答了我已经搜索过的所有内容,但找不到答案。我的问题可能是由于我搜索信息的方式,所以我决定使用StackOverflow,所以我可以用例子来表达我的问题。
我有五分钟的OHLC数据DIA_5.csv然后我添加了一个DayOfYear列来使用Lubridate;
library(lubridate)
DIA_5[,6]<- yday(DIA_5[,1])
看起来像这样;
Date Open High Low Close DOY
1 2015-09-21 09:30:00 164.6700 164.7100 164.3700 164.5300 264
2 2015-09-21 09:35:00 164.5300 164.9000 164.5300 164.6400 264
3 2015-09-21 09:40:00 164.6600 164.8900 164.6000 164.8900 264
4 2015-09-21 09:45:00 164.9100 165.0900 164.9100 164.9736 264
5 2015-09-21 09:50:00 164.9399 165.0980 164.8200 164.8200 264
我想要做的是创建一个新的d $ f,第一列从单独的日期编号开始,然后我将通过使用当天的原始OHLC d $ f对数据进行子集来填充这个新的d $ f年号。这样做的目的是在新的d $ f中我可以从第x天的所有高点中提取MAX值,并将其带到新d $ f的列上,依此类推其他变量。我可以达到这个目标的最接近的是使用以下代码,但是这将返回OHLC中的所有值,我无法找到更改此值,以便只有一年中的某一天被带到新的d $ f
DF<-DIA_5[match(unique(DIA_5[,6]), DIA_5[,6]),]
row.names DATE OPEN HIGH LOW CLOSE DOY
1 1 2015-09-21 09:30:00 164.67 164.7100 164.370 164.5300 264
2 79 2015-09-22 09:30:00 162.62 162.9600 162.620 162.7544 265
3 157 2015-09-23 09:30:00 163.26 163.3800 162.980 163.1400 266
4 235 2015-09-24 09:30:00 161.12 161.3700 161.060 161.2300 267
5 313 2015-09-25 09:30:00 163.81 163.9100 163.570 163.5800 268
尽管使用上述代码需要的数据多于所需数据,但我决定尝试对数据进行子集化。所以从上面我想在264旁边的行中使用这个值作为主OHLC d $ f的过滤器,然后在高位列中提取最高值。使用
DF[,6] <- max(subset(DIA_5[,3], yday(DIA_5[,1]) == DF[,6] ))
给了我
Warning message:
In yday(DIA_5[, 1]) == DF[, 6] :
longer object length is not a multiple of shorter object length
确实在d $ f上给出了一个新列,但重复的值相同。
row.names DATE OPEN HIGH LOW CLOSE DOY
1 1 2015-09-21 09:30:00 164.67 164.7100 164.370 164.5300 179.02
2 79 2015-09-22 09:30:00 162.62 162.9600 162.620 162.7544 179.02
3 157 2015-09-23 09:30:00 163.26 163.3800 162.980 163.1400 179.02
4 235 2015-09-24 09:30:00 161.12 161.3700 161.060 161.2300 179.02
5 313 2015-09-25 09:30:00 163.81 163.9100 163.570 163.5800 179.02
6 391 2015-09-28 09:30:00 162.04 162.0600 161.660 161.7100 179.02
我尝试使用我的子集语法从随机DOY数中提取最大值,它似乎工作正常;
h <- max(subset(DIA_5[,3], yday(DIA_5[,1]) == DF[1,6] ))
但我无法找到如何执行此操作,以便在MAX
年的高x
天的高列中创建{{1}}值的新列。
非常感谢任何帮助。
答案 0 :(得分:2)
您可以使用dplyr
。
我创建了一些看起来像这样的假数据并将其存储在df
:
Date Open High Low Close DOY
1 2015-09-21 164.6700 164.710 164.37 164.5300 264
2 2015-09-21 164.5300 164.900 164.53 164.6400 264
3 2015-09-21 164.6600 164.890 164.60 164.8900 264
4 2015-09-22 164.9100 165.090 164.91 164.9736 265
5 2015-09-22 164.9399 165.098 164.82 164.8200 265
6 2015-09-22 162.6200 162.960 162.62 162.7544 265
7 2015-09-23 163.2600 163.380 162.98 163.1400 266
8 2015-09-23 161.1200 161.370 161.06 161.2300 266
9 2015-09-23 163.8100 163.910 163.57 163.5800 266
library(dplyr)
x <- df %>%
group_by(DOY) %>%
filter(High == max(High)) %>%
as.data.frame()
x
Date Open High Low Close DOY
1 2015-09-21 164.5300 164.900 164.53 164.64 264
2 2015-09-22 164.9399 165.098 164.82 164.82 265
3 2015-09-23 163.8100 163.910 163.57 163.58 266
答案 1 :(得分:1)
aggregate
对于此
#simulate some time series and place in data.frame
set.seed(1)
d = data.frame(replicate(5,cumsum(rnorm(2000))))
d$doy = sort(sample(1:364,2000,replace=T))
print(d[d$doy==1,])
X1 X2 X3 X4 X5 doy
1 -0.6264538 -0.88614959 -1.1346302 -0.6188271 0.2637034 1
2 -0.4428105 -2.80840448 -0.3700731 -1.7282490 -0.5657484 1
3 -1.2784391 -1.18870374 0.2006371 -3.8985843 -2.0273832 1
4 0.3168417 -0.66943383 -1.1510569 -3.9298873 -0.3433930 1
5 0.6463495 -0.72528376 -3.1809423 -4.1902858 -1.8877173 1
6 -0.1741189 -0.02886615 -2.5904637 -3.6558553 -2.0786045 1
7 0.3133101 0.02464952 -4.0035337 -4.2152947 -1.0623928 1
8 1.0516348 -1.28563397 -2.3931921 -2.6069245 -0.5152666 1
9 1.6274162 -3.40870003 -0.5527496 -2.0502848 0.2398875 1
#aggregate data by DOY and compute some statistics for each column
maxPerDOY.df = aggregate(d[1:5],list(doy=d$doy),max)
print(head(maxPerDOY.df,3))
doy X1 X2 X3 X4 X5
1 1 1.627416 0.02464952 0.2006371 -0.6188271 0.2637034
2 2 3.223652 -2.76920768 0.8155484 -1.8646623 2.1378466
3 3 3.216576 -3.39431265 -0.8062283 -0.6656144 2.9014736
答案 2 :(得分:0)
使用Teja K给出的建议我设法编码了我的项目所需的所有转租。 dplyr是一款出色的包装,专为此而设计。对于像我这样的新手,它们的语法也非常容易。感谢所有大厅的人。