簡體   English   中英

通過基於多個條件對行進行求和來在R中創建向量

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

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