簡體   English   中英

R循環遍歷兩個列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM