在循环中设置colnames将名称设置为数字

时间:2013-12-21 17:22:28

标签: r

我正在尝试将数据框的列名更改为股票代码,因为我循环浏览股票代码列表并下载股票数据。

我有一个我读过的股票清单然后循环。在循环中,我下载了股票数据,设置了列名,然后与另一个数据框合并,但是当我打印这些名字时,数字被设置为列名而不是股票代码。

例如,在stocks.txt中,我有:

JCP
SVM
GSG

r代码如下:

options(digits=4, width=70)
library("zoo")
library(tseries)


# load the data into a zoo object using the zoo function read.csv
source(file="portfolio.r")

# Dowload the stock data of stocks listed in the stocks listing, such as stocks.txt
stocksymbols = read.table("stocks.txt", 
               sep="\t", 
               col.names=c("symbols"), 
               fill=FALSE, 
               strip.white=TRUE)
stocksymbols

prices <- get.hist.quote(instrument="^gspc", start="2013-01-01",
                      end="2013-12-21", quote="AdjClose",
                      provider="yahoo", origin="1970-01-01",
                      compression="d", retclass="zoo")

colnames(prices)[1] <- "GSPC"
for(i in 1:nrow(stocksymbols)) {
    stocksymbol <- stocksymbols[i,]
    con <- url("http://quote.yahoo.com")
    if(!inherits(try(open(con), silent = TRUE), "try-error")) {
      close(con)
      x <- get.hist.quote(instrument=stocksymbol, start="2013-01-01",
                          end="2013-12-21", quote="AdjClose",
                          provider="yahoo", origin="1970-01-01",
                          compression="d", retclass="zoo")
      colnames(x)[1] <- stocksymbol

      prices <- merge(prices, x)

    }
}

colnames(prices)

如何将列名更改为股票代码而不是数字。

1 个答案:

答案 0 :(得分:1)

问题在于stocksymbols是一个因素。如果您在stringsAsFactors=F电话中添加read.table(...),则代码可以正常运行。

stocksymbols = read.table("~/stocks.txt", 
                          sep="\t", 
                          col.names=c("symbols"), 
                          stringsAsFactors=F,    # read as a character vector...
                          fill=FALSE, 
                          strip.white=TRUE)