[英]R Loop Iterating Over Two Lists
我試圖遍歷R中的多個數據幀,並從每個數據幀中提取一列,然后在單獨的列表中減去元素的值。 例如,我想要
df1$my_new_col<-df1$my_col - my_list[[1]]
df2$my_new_col<-df2$my_col - my_list[[2]]
etc...
我編寫的代碼僅提取列表中的最后一個元素,並將其用於所有計算中。
簡而言之,我有一個名為日期的列表,它是日期的列表,還有一個名為spx_list的列表,它是標普500指數年化收益的列表。
在我的代碼中,我試圖遍歷每個日期並提取該日期的股票收益數據框架。 在第二個循環中,我遍歷了也與每個日期相對應的標准普爾收益表,並嘗試從該期間的每個股票收益中減去每個標准普爾500收益。 每個日期提取的數據框如下所示:
對於日期1
Ticker Name Total.Return.Y.3..I.
JNS US Equity JANUS CAPITAL GR 25.27
UNP US Equity UNION PAC CORP 24.98
CVX US Equity CHEVRON CORP 24.87
BHI US Equity BAKER HUGHES A G 24.81
RAI US Equity REYNOLDS AMERICA 24.72
XOM US Equity EXXON MOBIL CORP 24.55
CBRE US Equity CBRE GROUP INC-A 24.43
GT US Equity GOODYEAR TIRE 24.39
對於日期2
Ticker Name Total.Return.Y.3..I.
JNS US Equity JANUS CAPITAL GR 21.03
UNP US Equity UNION PAC CORP 16.33
CVX US Equity CHEVRON CORP 12.21
BHI US Equity BAKER HUGHES A G 47.69
RAI US Equity REYNOLDS AMERICA 18.39
XOM US Equity EXXON MOBIL CORP 24.50
CBRE US Equity CBRE GROUP INC-A 10.81
GT US Equity GOODYEAR TIRE 11.13
對於我的標准普爾數據:
Ticker date Annualized 3
SPX INDEX 3/31/2019 11.22854225
SPX INDEX 12/31/2018 7.041799573
SPX INDEX 9/30/2018 14.91926793
SPX INDEX 6/30/2018 9.629826851
列出資料
dates <- list('2019-03-31','2018-12-31','2018-09-30','2018-06-30',
'2018-03-31','2017-12-31','2017-09-30','2017-06-30',
'2017-03-31','2016-12-31','2016-09-30','2016-06-30',
'2016-03-31','2015-12-31','2015-09-30','2015-06-30',
'2015-03-31','2014-12-31','2014-09-30','2014-06-30',
'2014-03-31','2013-12-31','2013-09-30','2013-06-30',
'2013-03-31','2012-12-31','2012-09-30','2012-06-30',
'2012-03-31','2011-12-31','2011-09-30','2011-06-30',
'2011-03-31','2010-12-31','2010-09-30','2010-06-30',
'2010-03-31','2009-12-31','2009-09-30','2009-06-30',
'2009-03-31','2008-12-31','2008-09-30','2008-06-30',
'2008-03-31','2007-12-31','2007-09-30','2007-06-30',
'2007-03-31','2006-12-31','2006-09-30','2006-06-30',
'2006-03-31','2005-12-31','2005-09-30','2005-06-30',
'2005-03-31','2004-12-31','2004-09-30','2004-06-30',
'2004-03-31','2003-12-31','2003-09-30','2003-06-30',
'2003-03-31','2002-12-31','2002-09-30','2002-06-30',
'2002-03-31','2001-12-31','2001-09-30','2001-06-30',
'2001-03-31','2000-12-31','2000-09-30','2000-06-30',
'2000-03-31')
碼
library(Rblpapi)
blpConnect()
library(dplyr)
spx <- read.csv('spx_3.csv')
spx_list <- as.list(spx$Annualized.3)
totals <- list()
returns <- list()
for(i in dates){
df <- beqs('ROLLING RETURNS','PRIVATE',date=as.Date(i))
df_beats <- df%>%
select(date,Ticker,Total.Return.Y.3..I.)
df_beats <- na.omit(df_beats)
for(j in 1:length(spx_list)){
df_beats$Relative_Performance <- df_beats$Total.Return.Y.3..I.-spx_list[[j]]
counts <- sum(df_beats$Relative_Performance>0)
yes <- df_beats%>%
filter(df_beats$Relative_Performance>0)
averages <- mean(yes$Total.Return.Y.3..I.)
totals[[i]] <- counts
returns[[i]] <- averages
}
}
目的是找出給定年份的股票超過標准普爾500指數的百分比,並通過從單個股票收益中減去標准普爾500的收益來找出每只股票的表現不佳或表現出色。
循環完成后,我發現在計算中僅使用了S&p 500列表的最后一個元素,而其他收益則被跳過。 因此,在這種情況下,將在每個時間段內為每個數據幀使用9.629的值。 理想情況下,我希望從Date 1 Total.Return.Y.3..I中減去11.22,從Date 2 $ Total.Return.Y.3..I中減去7.04等。
我想知道是否有人能夠幫助我提取每個時期的數據,而不是僅使用標准普爾500指數中的最后一個元素?
考慮在集合中而不是嵌套循環中處理您的過程。 具體來說,構建單個beqs數據集,然后按日期將其與spx合並以進行差值計算。 最后,按日期匯總所需的總計和回報 。
spx <- read.csv('spx_3.csv')
# BUILD LIST OF BEQS DATA FRAMES FOR EACH QUARTERLY DATE
df_list <- lapply(spx$date, function(i) {
df <- beqs('ROLLING RETURNS', 'PRIVATE', date=as.Date(i))
df <- df[c("date", "Ticker", "Total.Return.Y.3..I.")]
return(na.omit(df))
})
# APPEND ALL FOR SINGLE DATA FRAME
df_beqs <- do.call(rbind, df_list)
# MERGE AND ADD NEW COLUMN
final_df <- transform(merge(df_beats, spx, by = "date"),
Relative_Performance = `Total.Return.Y.3..I.` - `Annualized 3`)
# FILTER DATA FRAME
final_df <- final_df[final_df$Relative_Performance > 0,]
# AGGREGATE BY DATE FOR MATRIX OUTPUT
agg_df <- aggregate(Total.Return.Y.3..I. ~ date, final_df,
function(x) c(totals = length(x), returns = mean(x)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.