簡體   English   中英

通過R中的行值進行子集

[英]Subsetting by row value in R

首先道歉,如果已經回答了這個問題,否則我到處都在搜索,但是找不到答案。 我的問題可能是由於我搜索信息的方式所致,因此我決定使用StackOverflow,以便通過示例展示我的問題。

我有五分鍾的OHLC數據DIA_5.csv,然后將其添加到使用Lubridate的DayOfYear列中。

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值的新列。

任何幫助,將不勝感激。

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

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

使用給定的建議,Teja KI設法對我的項目所需的所有分租進行編碼。 dplyr是一個出色的軟件包,正是為此而設計的。 對於像我這樣的菜鳥來說,它們的語法也非常容易。 感謝所有會場的家伙。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM