代码之家  ›  专栏  ›  技术社区  ›  Rana

对于在r中返回相同值的循环

  •  0
  • Rana  · 技术社区  · 1 年前

    我试图循环浏览中的股票列表,计算每只股票的最小值,然后将其放入一个单独的列表中。我查过类似的问题,但似乎没有一个能解决我的问题。

    我的股票列表来自道琼斯指数,列表看起来像

    library(tidyquant); library(dplyr)
    DOW_st <- data.frame(tq_index("DOW")[,1])
    DOW_st <- DOW_st %>% filter(row_number() <= n()-1)
    DOW_st
    
       symbol
    1     UNH
    2      GS
    3    MSFT
    4      HD
    5     CAT
    6    AMGN
    7       V
    8     MCD
    9     CRM
    10    AXP
    11    HON
    12    TRV
    13   AAPL
    14    JPM
    15   AMZN
    16     BA
    17    IBM
    18     PG
    19    CVX
    20    JNJ
    21    MRK
    22    DIS
    23    MMM
    24    NKE
    25    WMT
    26     KO
    27    DOW
    28   CSCO
    29     VZ
    

    然后,我用函数设置了空列表和循环。循环包括使用tq_get获取股票数据,并返回该时间段内的股票数据。当我输出数据时

    DOW_st_data <- list()
    
    for (i in DOW_st){
      data_i <- tq_get(i, from = "1980-01-01", to = "2024-06-20", get = "stock.prices")
      min <- min(data_i$close, na.rm = T)
      comb <- cbind(i, min)
      DOW_st_data <- rbind(DOW_st_data, comb)
    }
    DOW_st_data 
         i      min                 
     [1,] "UNH"  "0.0299949999898672"
     [2,] "GS"   "0.0299949999898672"
     [3,] "MSFT" "0.0299949999898672"
     [4,] "HD"   "0.0299949999898672"
     [5,] "CAT"  "0.0299949999898672"
     [6,] "AMGN" "0.0299949999898672"
     [7,] "V"    "0.0299949999898672"
     [8,] "MCD"  "0.0299949999898672"
     [9,] "CRM"  "0.0299949999898672"
    [10,] "AXP"  "0.0299949999898672"
    [11,] "HON"  "0.0299949999898672"
    [12,] "TRV"  "0.0299949999898672"
    [13,] "AAPL" "0.0299949999898672"
    [14,] "JPM"  "0.0299949999898672"
    [15,] "AMZN" "0.0299949999898672"
    [16,] "BA"   "0.0299949999898672"
    [17,] "IBM"  "0.0299949999898672"
    [18,] "PG"   "0.0299949999898672"
    [19,] "CVX"  "0.0299949999898672"
    [20,] "JNJ"  "0.0299949999898672"
    [21,] "MRK"  "0.0299949999898672"
    [22,] "DIS"  "0.0299949999898672"
    [23,] "MMM"  "0.0299949999898672"
    [24,] "NKE"  "0.0299949999898672"
    [25,] "WMT"  "0.0299949999898672"
    [26,] "KO"   "0.0299949999898672"
    [27,] "DOW"  "0.0299949999898672"
    [28,] "CSCO" "0.0299949999898672"
    [29,] "VZ"   "0.0299949999898672"
    

    我尝试过使用[]以各种方式对数据进行索引,但总是得到大致相同的结果。任何指示都将不胜感激。

    2 回复  |  直到 1 年前
        1
  •  2
  •   margusl    1 年前

    问题的表述方式使这个答案有些偏离主题,但 tq_get() 也可以取符号的矢量,即您不需要在这里循环,只需获取所有结果并按符号进行总结:

    library(tidyquant)
    library(dplyr)
    
    DOW_st <- data.frame(tq_index("DOW")[,1])
    DOW_st <- head(DOW_st, -1)
    
    data_ <- tq_get(DOW_st$symbol, from = "1980-01-01", to = "2024-06-20", get = "stock.prices")
    data_ |>
      summarise(close_min = min(close, na.rm = TRUE), .by = symbol)
    #> # A tibble: 30 × 2
    #>    symbol close_min
    #>    <chr>      <dbl>
    #>  1 UNH       0.0859
    #>  2 GS       52     
    #>  3 MSFT      0.0903
    #>  4 HD        0.0300
    #>  5 CAT       3.58  
    #>  6 AMGN      0.0755
    #>  7 V        10.6   
    #>  8 MCD       0.895 
    #>  9 CRM       2.40  
    #> 10 AXP       1.64  
    #> # ℹ 20 more rows
    

    创建于2024-06-21 reprex v2.1.0

        2
  •  1
  •   Jon Spring    1 年前

    您已经创建了一个数据帧 DOW_st 具有名为的列 symbol 。如果我们首先创建一个空 min 列,我们可以循环通过 象征 列的值,查找价格,并将最小值分配给 最小 我们创建的列:

    DOW_st$min = NA_real_
    for (i in DOW_st$symbol){
      data_i <- tq_get(i, from = "1980-01-01", to = "2024-06-20", get = "stock.prices")
      DOW_st$min[DOW_st$symbol == i] = min(data_i$close, na.rm = T)
    }