用于从 R 中具有特定条件的数据框中删除行的函数

Function to eliminate rows from a dataframe with certain condition in R

各位!

我会尽力解释我的问题。这对我来说很难。我希望你能帮助我:

我有一个数据框,我们称它为 DF1,它看起来像下一个:

|Symbol |   Date    | Volume |  Price|
|----------------------------|-------|
|A      |2014-01-01 | 0      |    4  |
|A      |2014-01-02 | 7      |    7  |
|A      |2014-01-03 | 8      |    9  |
|A      |2014-01-04 | 1      |    5  |
|B      |2014-01-01 |45      |    6  |
|B      |2014-01-02 |0       |   11  |
|B      |2014-01-03 |34      |    8  |
|B      |2014-01-04 |45      |    5  |
|C      |2014-01-01 |4       |    6  |
|C      |2014-01-02 |0       |    5  |
|C      |2014-01-03 |14      |   25  |
|D      |2014-01-01 |31      |    4  |
|D      |2014-01-02 |7       |    6  |
|D      |2014-01-03 |18      |    3  |
|D      |2014-01-04 |15      |    7  |
|E      |2014-01-01 |13      |    8  |
|E      |2014-01-02 |0       |    9  |

有了这个数据框,我通过以下代码行创建了一个新的数据框,我们称之为 DF2:

RM <- DF1 %>% group_by(Date) %>%
  mutate(weight = Volume/sum(Volume),      
         R_i = weight*(log(Price)-log(lag(Price)))) %>%          
  summarise(RM = sum(R_i, na.rm = TRUE))

从 RM 开始,我 select 只有我感兴趣的日期 :

RM_reg <- subset(RM, date >= "2014-03-05" & date<="2014-09-03")

最后,RM_reg 看起来像这样:

|   Date    | RM     |
|2014-03-05 | 0      |
|2014-03-06 | 7      | 
|2014-03-07 | 8      |    
|2014-03-08 | 1      |    
|2014-03-09 | 45     |    
|2014-03-10 | 0      |   
|2014-03-11 | 34     |    
|2014-03-12 | 45     |   
|2014-03-13 | 4      |    
|2014-03-14 | 0      |    
|2014-03-15 | 14     |  
|2014-03-16 | 31     |    

需要注意的是,RM_reg栏中的值不是实际值,只是示例。从我原来的数据框开始,RM_reg 有 125 行。

然后,从数据帧 DF1 中,我通过以下代码提取 Company 列等于 A 的行:

DF_A <- DF_1%>%
  filter(Symbol=="A")

然后我通过以下代码向数据框DF_A添加一列returns:

RA <- DF_A %>% group_by(Symbol)%>%
  mutate(Ret_i = log(Price) - lag(log(Price)))

我去掉第一行,也就是NA:

AR <- na.omit(RA)

从 AR,我 select 只有我感兴趣的日期 :

AR_reg <- subset(AR, date >= "2014-03-05" & date<="2014-09-03")

AR_reg 看起来像这样:

|Symbol |   Date    | volume |price | Ret_i  |
|--------------------------------------------|
|A      |2014-03-05 | 1      |   5  |   2    |
|A      |2014-03-06 | 3      |   8  |   3    |
|A      |2014-03-07 | 7      |   4  |   4    |
|A      |2014-03-08 |3       |   6  |   5    |
|A      |2014-03-09 |34      |   7  |   1    |
|A      |2014-03-10 |45      |  34  |   4    |
|A      |2014-03-11 |4       |   5  |   3    |
|A      |2014-03-12 |9       |   7  |   5    |
|A      |2014-03-13 |8       |   6  |   6    |
|A      |2014-03-14 |4       |   4  |   1    |
|A      |2014-03-15 |0       |   7  |   4    |
|A      |2014-03-16 |4       |   7  |   7    |

需要注意的是,AR_reg栏中的值不是实际值,只是示例。从我原来的数据框开始,AR_reg 也有 125 行。

最后,因为RM_reg和AR_reg我可以通过下面的代码在RM_reg的RM列上回归AR_reg的Ret_i列:

mod <- lm(AR_reg$Ret_i ~ RM_reg$RM) 

我需要做的是对数据帧 DF1 中的所有符号执行与上述相同的操作,在本例中为“B”、“C”、“D”、“E”。问题是我们没有相同数量的条目,或者与所有符号对应的相同数量的行,这是能够进行回归的必要条件。要进行回归,我需要对每个符号进行 125 次 returns 观察。

我的想法是消除生成的类似于 AR_reg 的数据帧没有 125 个条目或行的符号;但事实是我不知道该怎么做,我想必须提出一个功能,但这是一个我仍然没有掌握的主题。

非常感谢你阅读我,我希望你已经理解了我。任何帮助或建议将不胜感激

翻译成www.DeepL.com/Translator(免费版)

通过 Date 加入 DF1RM,仅保留特定日期之间的数据,对于每个 Symbol 计算 Ret_i 并删除 NA 值并创建模型列表。

完整代码如下:

library(dplyr)

DF1$Date <- as.Date(DF1$Date)

RM <- DF1 %>% 
  group_by(Date) %>%
  mutate(weight = Volume/sum(Volume),      
         R_i = weight*(log(Price)-log(lag(Price)))) %>%          
  summarise(RM = sum(R_i, na.rm = TRUE))


result <- DF1 %>%
  left_join(RM, by = 'Date') %>%
  filter(between(Date, as.Date("2014-03-05"), as.Date("2014-09-03")))
  group_by(Symbol) %>%
  mutate(Ret_i = log(Price) - lag(log(Price))) %>%
  na.omit() %>%
  summarise(model = list(lm(Ret_i~RM)))

result