在R

时间:2016-01-14 14:41:21

标签: r subset lubridate

首先道歉,如果已经回答了我已经搜索过的所有内容,但找不到答案。我的问题可能是由于我搜索信息的方式,所以我决定使用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}}值的新列。

非常感谢任何帮助。

3 个答案:

答案 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是一款出色的包装,专为此而设计。对于像我这样的新手,它们的语法也非常容易。感谢所有大厅的人。