【问题标题】:Subsetting by row value in RR中的行值子集
【发布时间】:2016-01-14 14:41:21
【问题描述】:

首先抱歉,如果我已经在其他地方找到了答案,但我找不到答案。我的问题可能是由于我搜索信息的方式,所以我决定使用 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] ))

但我只是不知道如何执行此操作,以便它在一年中的 x 高列中创建一个新的 MAX 值列。

对此的任何帮助将不胜感激。

【问题讨论】:

  • 你试过使用包data.table吗?您可以尝试在表达式中使用 by 参数
  • 我认为你应该查看dplyr 教程。

标签: r subset lubridate


【解决方案1】:

您可以使用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

【讨论】:

  • 感谢 Teja,这非常有效。我现在只是想弄清楚如何按时间过滤掉 CLOSE 列-对此的任何建议将不胜感激。
  • 我不确定你的意思,你能提供更多细节吗?
【解决方案2】:

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

【讨论】:

  • 感谢 Soren 非常有帮助。
【解决方案3】:

根据 Teja K 给出的建议,我设法编写了项目所需的所有转租代码。 dplyr 是一个出色的软件包,正是为此而设计的。对于像我这样的菜鸟来说,它们的语法也非常简单。感谢所有大厅的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2020-10-10
    • 1970-01-01
    • 2020-12-17
    相关资源
    最近更新 更多