尝试通过在 R 中的 tibble 中随时间循环来添加逻辑列
Trying to add a column of logicals by looping over time in a tibble in R
我开始复制 Fama 和 French 在 r 中使用的价值因子来为我的期末论文构建投资组合策略。
我有标准普尔 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")
我开始复制 Fama 和 French 在 r 中使用的价值因子来为我的期末论文构建投资组合策略。
我有标准普尔 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")