[英]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.