[英]Create a vector in R by summing rows based on multiple criteria
我的財務數據目前間隔為15分鍾,但我希望在進行其余分析之前將時間間隔從15分鍾轉換為30分鍾。 因此,我想對兩個相鄰的15分鍾間隔的交易量進行求和,並取第二個15分鍾子間隔的收盤價(即30分鍾期間的結束時間)。
我在下面展示了使用sapply函數的數據(df)和所需輸出(df.30min)的示例。 這適用於下面的示例,但考慮到我正在分析10個公司的每日數據,每天有10個公司和27個間隔,處理時間過長,即使是一年的數據。 如果我嘗試for循環,我有類似的問題。
我是R的新手,所以我希望使用其中一個內置函數有一個相當簡單的解決方案。
在我的實際數據集中,有27 x 15分鍾的間隔(10:00-16:45)。 我希望我的最后“30分鍾”數據集在13:30-13:45之間有一個15分鍾的間隔。 此外,可能存在其他異常現象,即證券交易所提前開盤/早盤關閉,或者股票在一天中途停止交易。 (我已經設法使用具有匹配函數的查找表將我的數據中的時間映射到正確的Interval。)鑒於我的數據結構不完美,我的解決方案不依賴於完整集合,並且完全偶數15分鍾的間隔。 在Excel中我會使用sumifs函數。
set.seed(1)
df <- data.frame(
Company = rep(c("Co A", "Co B", "Co C"), each = 8),
Date = as.Date(rep(c("2005-01-01", "2005-01-02"), times = 3, each = 4)),
Time = as.factor(c("10:00:00", "10:15:00", "10:30:00", "10:45:00")),
Interval = as.factor(c(1,1,2,2)),
Interval.End = as.factor(c(0,1)),
Close = abs(round(rnorm(24),1))*10+100,
Volume = abs(round(rnorm(24),1))*10)
> df
Company Date Time Interval Interval.End Close Volume
1 Co A 2005-01-01 10:00:00 1 0 106 6
2 Co A 2005-01-01 10:15:00 1 1 102 1
3 Co A 2005-01-01 10:30:00 2 0 108 2
4 Co A 2005-01-01 10:45:00 2 1 116 15
5 Co A 2005-01-02 10:00:00 1 0 103 5
6 Co A 2005-01-02 10:15:00 1 1 108 4
7 Co A 2005-01-02 10:30:00 2 0 105 14
8 Co A 2005-01-02 10:45:00 2 1 107 1
9 Co B 2005-01-01 10:00:00 1 0 106 4
10 Co B 2005-01-01 10:15:00 1 1 103 1
11 Co B 2005-01-01 10:30:00 2 0 115 14
12 Co B 2005-01-01 10:45:00 2 1 104 4
13 Co B 2005-01-02 10:00:00 1 0 106 4
14 Co B 2005-01-02 10:15:00 1 1 122 1
15 Co B 2005-01-02 10:30:00 2 0 111 11
16 Co B 2005-01-02 10:45:00 2 1 100 8
17 Co C 2005-01-01 10:00:00 1 0 100 2
18 Co C 2005-01-01 10:15:00 1 1 109 3
19 Co C 2005-01-01 10:30:00 2 0 108 7
20 Co C 2005-01-01 10:45:00 2 1 106 6
21 Co C 2005-01-02 10:00:00 1 0 109 7
22 Co C 2005-01-02 10:15:00 1 1 108 7
23 Co C 2005-01-02 10:30:00 2 0 101 4
24 Co C 2005-01-02 10:45:00 2 1 120 8
df.30min <- df[-which(df$Interval.End == 0),]
df.30min$Volume <-sapply(seq_len(nrow(df.30min)),
function(i) sum(df$Volume[df$Company == df.30min$Company[i] &
df$Date == df.30min$Date[i] &
df$Interval == df.30min$Interval[i]]))
> df.30min
Company Date Time Interval Interval.End Close Volume
2 Co A 2005-01-01 10:15:00 1 1 102 7
4 Co A 2005-01-01 10:45:00 2 1 116 17
6 Co A 2005-01-02 10:15:00 1 1 108 9
8 Co A 2005-01-02 10:45:00 2 1 107 15
10 Co B 2005-01-01 10:15:00 1 1 103 5
12 Co B 2005-01-01 10:45:00 2 1 104 18
14 Co B 2005-01-02 10:15:00 1 1 122 5
16 Co B 2005-01-02 10:45:00 2 1 100 19
18 Co C 2005-01-01 10:15:00 1 1 109 5
20 Co C 2005-01-01 10:45:00 2 1 106 13
22 Co C 2005-01-02 10:15:00 1 1 108 14
24 Co C 2005-01-02 10:45:00 2 1 120 12
使用庫dplyr
,你可以嘗試這樣的事情:
library(dplyr)
df %>% arrange(Company, Date, Time, Interval, Interval.End) %>% group_by(Company, Date, Interval) %>% summarise(Time = Time[2], Interval.End = Interval.End[2], Close = Close[2], Volume = sum(Volume))
Source: local data frame [12 x 7]
Groups: Company, Date [?]
Company Date Interval Time Interval.End Close Volume
(fctr) (date) (fctr) (fctr) (fctr) (dbl) (dbl)
1 Co A 2005-01-01 1 10:15:00 1 102 7
2 Co A 2005-01-01 2 10:45:00 1 116 17
3 Co A 2005-01-02 1 10:15:00 1 108 9
4 Co A 2005-01-02 2 10:45:00 1 107 15
5 Co B 2005-01-01 1 10:15:00 1 103 5
6 Co B 2005-01-01 2 10:45:00 1 104 18
7 Co B 2005-01-02 1 10:15:00 1 122 5
8 Co B 2005-01-02 2 10:45:00 1 100 19
9 Co C 2005-01-01 1 10:15:00 1 109 5
10 Co C 2005-01-01 2 10:45:00 1 106 13
11 Co C 2005-01-02 1 10:15:00 1 108 14
12 Co C 2005-01-02 2 10:45:00 1 120 12
如果您的數據框已經正確排列,您可以擺脫上面的arrange
部分。
注意:我假設總有兩個間隔(0,1),因此使用硬編碼值2
。 如果不是這種情況,您可以使用正確的子集。
我們可以使用data.table
來做到這data.table
library(data.table)
setDT(df)[order(Company, Date, Time, Interval),
list(Time=Time[2L], Interval.End = Interval.End[2L],
Close = Close[2L], Volume = sum(Volume)),
by = .(Company, Date, Interval)]
# Company Date Interval Time Interval.End Close Volume
# 1: Co A 2005-01-01 1 10:15:00 1 102 7
# 2: Co A 2005-01-01 2 10:45:00 1 116 17
# 3: Co A 2005-01-02 1 10:15:00 1 108 9
# 4: Co A 2005-01-02 2 10:45:00 1 107 15
# 5: Co B 2005-01-01 1 10:15:00 1 103 5
# 6: Co B 2005-01-01 2 10:45:00 1 104 18
# 7: Co B 2005-01-02 1 10:15:00 1 122 5
# 8: Co B 2005-01-02 2 10:45:00 1 100 19
# 9: Co C 2005-01-01 1 10:15:00 1 109 5
#10: Co C 2005-01-01 2 10:45:00 1 106 13
#11: Co C 2005-01-02 1 10:15:00 1 108 14
#12: Co C 2005-01-02 2 10:45:00 1 120 12
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.