簡體   English   中英

For循環重命名許多對象的列名R

[英]For Loop to Rename Column Names of Many Objects R

我正在尋找一種方法來使用 for 循環或 R 中的其他方法重命名多個對象的列。 最終,我希望能夠將每個 Stock object 的行綁定到一個大數據框中,但由於列名不同而不能。 下面的例子:

AAPL <-
Date        AAPL.Open  AAPL.High AAPL.Low  AAPL.Close  AAPL.Volume  AAPL.Adjusted  Stock  pct_change
2020-05-14  304.51     309.79    301.53    309.54      39732300     309.54         AAPL   0.61
2020-05-15  300.35     307.90    300.21    307.71      41561200     307.71         AAPL  -0.59


GOOG <-  
Date        GOOG.Open GOOG.High  GOOG.Low  GOOG.Close  GOOG.Volume   GOOG.Adjusted  Stock  pct_change 
2020-05-14  1335.02   1357.420   1323.910  1356.13     1603100       1356.13        GOOG   0.50
2020-05-15  1350.00   1374.480   1339.000  1373.19     1705700       1373.19        GOOG   1.26

對於這個例子,我有 2 個對象(AAPL 和 GOOG),但實際上我會使用更多對象。 我可以創建一個for循環來遍歷每個object,並將每個的第二列重命名為“Open”,第三列重命名為“High”,第四列重命名為“Low”,......等等,然后我可以綁定所有這些對象在一起?

我已經有一個名為“Stock”的列,所以我不需要列名的 Ticker 部分。

如果您可以保證這些列的順序,則應該這樣做:

for(df in list(AAPL, GOOG))
  colnames(df) <- c("Date", "Open", "High", "Low", "Close", "Volume", "Adjusted", "Stock", "pct_change")

使用quantmod ,我們可以讀取一組股票代碼,將它們的名稱和rbind()清理到單個數據幀中。

此答案中說明了三個關鍵功能,包括:

  1. 一旦它們被加載到 memory 中,使用get()訪問由quantmod::getSymbols()寫入的對象。

  2. 使用傳遞給lapply()的符號名稱將symbol列添加到每個數據幀。

  3. getSymbols()寫入的xts對象中存儲為行名的日期轉換為數據框列。

首先,我們將使用getSymbols()從 yahoo.com 中讀取數據。

library(quantmod)
from.dat <- as.Date("12/02/19",format="%m/%d/%y")
to.dat <- as.Date("12/06/19",format="%m/%d/%y")

theSymbols <- c("AAPL","AXP","BA","CAT","CSCO","CVX","XOM","GS","HD","IBM",
                "INTC","JNJ","KO","JPM","MCD","MMM","MRK","MSFT","NKE","PFE","PG",
                "TRV","UNH","UTX","VZ","V","WBA","WMT","DIS","DOW")
getSymbols(theSymbols,from=from.dat,to=to.dat,src="yahoo")

# since quantmod::getSymbols() writes named data frames, need to use
# get() with the symbol names to access each data frame
head(get(theSymbols[[1]]))



> head(get(theSymbols[[1]]))
           AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
2019-12-02    267.27    268.25   263.45     264.16    23621800      262.8231
2019-12-03    258.31    259.53   256.29     259.45    28607600      258.1370
2019-12-04    261.07    263.31   260.68     261.74    16795400      260.4153
2019-12-05    263.79    265.89   262.73     265.58    18606100      264.2359

說明了如何在全局環境中訪問符號對象后,我們將使用lapply()從行名稱中提取日期,清理列標題,並將符號名稱寫入每個符號數據 object 的列。

# convert to list
symbolData <- lapply(theSymbols,function(x){
     y <- as.data.frame(get(x))
     colnames(y) <- c("open","high","low","close","volume","adjusted")
     y$date <- rownames(y)
     y$symbol <- x
     y
})

最后,我們將數據幀列表轉換為單個數據幀。

#combine to single data frame
combinedData <- do.call(rbind,symbolData)
rownames(combinedData) <- 1:nrow(combinedData)

...和 output:

> nrow(combinedData)
[1] 120
> head(combinedData)
    open   high    low  close   volume adjusted       date symbol
1 267.27 268.25 263.45 264.16 23621800 262.8231 2019-12-02   AAPL
2 258.31 259.53 256.29 259.45 28607600 258.1370 2019-12-03   AAPL
3 261.07 263.31 260.68 261.74 16795400 260.4153 2019-12-04   AAPL
4 263.79 265.89 262.73 265.58 18606100 264.2359 2019-12-05   AAPL
5 120.31 120.36 117.07 117.26  5538200 116.2095 2019-12-02    AXP
6 116.04 116.75 114.65 116.57  3792300 115.5256 2019-12-03    AXP
> 

使用lapply ,我們可以遍歷list並使用sub刪除列名中的前綴。 這可以在沒有任何外部包的情況下完成

lst1 <- lapply(list(AAPL, GOOG),  function(x)  {
        colnames(x) <- sub(".*\\.", "", colnames(x))
    x})

我在這里嘗試了答案,我的符號列表在向量 'symbol_mayus' 中

    symbolData <- lapply(symbol_mayus,function(x){
  y <- as.data.frame(get(x))
  colnames(y) <- c("open","high","low","close","volume","adjusted")
  y$date <- rownames(y)
  y$symbol <- x
  y
})

我得到一個錯誤:

 Error in names(x) <- value : 
      el atributo 'names' [6] debe tener la misma longitud que el vector [2] 

它說“名稱”應該與向量[2]的長度相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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