for 循环重命名许多对象的列名 r



我正在寻找一种在 R 中使用 for 循环或其他方法重命名多个对象的列的方法。 最终,我希望能够将每个 Stock 对象的行绑定到一个大型数据框中,但由于列名不同而无法。示例如下:

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 循环来迭代每个对象,并将每个对象的第 2 列重命名为"打开",将第 3 列重命名为"高",将第 4 列重命名为"低"吗,....等等,这样我就可以将所有这些对象绑定在一起吗?

我已经有一个名为"股票"的列,所以我不需要列名称的股票代码部分。

使用quantmod我们可以读取一组股票代码,将它们的名称清理干净并rbind()到单个数据框中。

此答案中说明了三个关键功能,包括:

  1. 使用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()从行名称中提取日期,清理列标题,并将符号名称编写为每个符号的数据对象的列。

# 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)

。和输出:

> 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
> 

如果你能保证这些列的顺序,这应该可以做到:

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

使用lapply,我们可以遍历list并用sub删除列名中的前缀。 这可以在没有任何外部包的情况下完成

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

最新更新