尝试通过在 R 中的 tibble 中随时间循环来添加逻辑列

Trying to add a column of logicals by looping over time in a tibble in R

我开始复制 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 的列?

您不需要循环。

假设您的数据框是 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")