2017-06-03 91 views
2

我是R,loop和quantmod的新手。 我正在嘗試構建一個可用於計算更容易使用的數據庫(以列格式)。循環通過new.env()R(quantmod)

我想知道如何使用「循環」來自動化下面的過程。 我只是將兩個數據集綁定在一起。

正如您所看到的,我已經使用rbind,Google和Apple股票價格將兩個數據集綁定在一起。如果我有100只股票,這個過程需要很長時間,因此我想知道如何實現這個過程的自動化?

library(quantmod) 
tickers<- c("AAPL", "GOOG") 
all<- new.env() 
getSymbols(tickers,src="google", env = all, from = Sys.Date()-100, to = Sys.Date()) 

apple_share<- all$AAPL 
colnames(apple_share)<- c("Open", "High", "Low", "Close", "Volume") 
apple_share$Ticker<- rep(1, nrow(apple_share)) 

google_share<- all$GOOG 
colnames(google_share)<- c("Open", "High", "Low", "Close", "Volume") 
google_share$Ticker<- rep(2, nrow(google_share)) 

combined_data<- rbind(apple_share,google_share) 

非常感謝,

Shoups

回答

1

tidyquant正是像你問的一個任務創建的包獲取值。假設你的quantmod包更新到0.4-9版本,它允許再次從雅虎的價格下載,該tq_get功能將下載的數據,並以「由符號分組」,您將獲得所需的輸出。

> library(tidyquant) 
stocks <- c("AAPL", "GOOG", "NFLX") %>% 
    tq_get(get = "stock.prices", 
      from = "2010-01-01", 
      to = "2015-12-31") %>% 
    group_by(symbol) 

> stocks 
Source: local data frame [4,527 x 8] 
Groups: symbol [3] 

# A tibble: 4,527 x 8 
    symbol  date open high low close volume 
    <chr>  <date> <dbl> <dbl> <dbl> <dbl>  <dbl> 
1 AAPL 2010-01-04 213.43 214.50 212.38 214.01 123432400 
2 AAPL 2010-01-05 214.60 215.59 213.25 214.38 150476200 
3 AAPL 2010-01-06 214.38 215.23 210.75 210.97 138040000 
4 AAPL 2010-01-07 211.75 212.00 209.05 210.58 119282800 
5 AAPL 2010-01-08 210.30 212.00 209.06 211.98 111902700 
6 AAPL 2010-01-11 212.80 213.00 208.45 210.11 115557400 
7 AAPL 2010-01-12 209.19 209.77 206.42 207.72 148614900 
8 AAPL 2010-01-13 207.87 210.93 204.10 210.65 151473000 
9 AAPL 2010-01-14 210.11 210.46 209.02 209.43 108223500 
10 AAPL 2010-01-15 210.93 211.60 205.87 205.93 148516900 
# ... with 4,517 more rows, and 1 more variables: adjusted <dbl> 
+0

的字符太棒了!謝謝 –

0

我們可以通過mget

lst <- Map(cbind, mget(tickers, envir = all), Ticker = seq_along(tickers)) 
lst <- lapply(lst, function(x) setNames(x, sub("[^.]+\\.", "", names(x)))) 
newdat <- do.call(rbind, lst) 
head(newdat) 
#    Open High Low Close Volume Ticker 
#2017-02-23 137.38 137.48 136.30 136.53 20788186  1 
#2017-02-23 830.12 832.46 822.88 831.33 1472771  2 
#2017-02-24 135.91 136.66 135.28 136.66 21776585  1 
#2017-02-24 827.73 829.00 824.20 828.64 1392202  2 
#2017-02-27 137.14 137.44 136.28 136.93 20257426  1 
#2017-02-27 824.55 830.50 824.00 829.28 1101466  2 
+1

謝謝非常多! 這真的很有幫助。我會仔細研究這個:) –

+1

嗨,對不起,再次打擾你。再次感謝代碼。有一部分我有點困惑。你寫道:setNames(x ,sub(「[^。] + \\。」,「」,names(x)),我假設這是一個函數,用來代替列的標題,所以它只顯示「Open」而不是「AAPL」。打開「,我想知道[^。] + \\代表什麼意思?我以前從未見過這樣的內容。 –

+0

@ShuopengCui It是基於您的代碼來將'AAPL.Open'替換爲'打開'的前綴。 '[^。] +'語法的語法是匹配一個或多個不是'.' – akrun