【问题标题】:Trying to add a column of logicals by looping over time in a tibble in R尝试通过在 R 中的 tibble 中随时间循环来添加一列逻辑
【发布时间】:2020-07-12 16:03:42
【问题描述】:

我开始复制 Fama 和 French 在 中使用的价值因素,为我的期末论文制定投资组合策略。

我有一个多年来标准普尔 500 指数的月度市值数据集。我创建了一个循环来确定在某个日期确定的观测值的变量(mkt cap)是否高于或低于同时横截面计算的某个阈值(跨越时间 t 变量 mkt cap 的所有观测值) )。 为了实现这一点,我认为适当的技术是 for 循环。这样,对于每个日期,我都会计算阈值并检查标准。不幸的是,我无法在循环期间存储逻辑。当我打印结果时,我可以看到我想要存储的内容,但是当我尝试存储时,我只得到与循环最后一步相关的结果。

for(d in dates$date){
  month <- data_tbk %>% filter(date==d) 
  up <- quantile(month$mktcap, 0.8, na.rm=TRUE)
  low <- quantile(month$mktcap, 0.2, na.rm=TRUE)
  data_tbk %>% filter(date==d) %>%
    mutate(ptf=ifelse(mktcap>=up,1,ifelse(mktcap<=low,0,NA))) %>%
    print
    }

我试图追求的另一种方式是以下,但我得到的更少:

data_tbk$ptf <- NA
for(d in dates$date){
  month <- data_tbk %>% filter(date==d)
  up <- quantile(month$mktcap, 0.8, na.rm=TRUE)
  low <- quantile(month$mktcap, 0.2, na.rm=TRUE)
  data_tbk %>% filter(date==d) %>% filter(mktcap>=up) %>% ptf=1
  filter(data_tbk, date==d) %>% filter(mktcap<=low) %>% ptf=0
  }

我应该如何更改代码以根据条件获得包含逻辑 1 或 0 的列?

【问题讨论】:

    标签: r r for-loop dplyr tidyverse finance


    【解决方案1】:

    你不需要循环。

    假设您的数据框是data_tbk,此代码将创建新变量is_higher。如果mktcap 大于 Q80%,则为 1,如果小于 Q20%,则为 0,其余为 NA。

    library(dplyr)
    
    data_tbk  <- data_tbk %>% 
        mutate(is_higher = case_when(
                            mktcap >  quantile(mktcap,0.8) ~ 1,
                            mktcap <= quantile(mktcap,0.2) ~ 0,
                            TRUE ~ NA) )
    

    如果您希望按日期计算分位数,请添加group_by 子句。

    data_tbk <- data_tbk %>% 
        group_by(date) %>%
        mutate(is_higher = case_when(
                            mktcap >  quantile(mktcap,0.8) ~ 1,
                            mktcap <= quantile(mktcap,0.2) ~ 0,
                            TRUE ~ NA) )
    

    PS。你需要安装包dplyr

    install.package("dplyr")
    

    【讨论】:

    • 为了清楚起见,我想补充一点,显示的数据框是 data_tbk
    猜你喜欢
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2018-06-11
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多