0

我从雅虎获得以下两种资产的月度价格值:

if(!require("tseries") | !require(its) ) { install.packages(c("tseries", 'its'));  require("tseries"); require(its) } 
startDate <- as.Date("2000-01-01", format="%Y-%m-%d")
MSFT.prices = get.hist.quote(instrument="msft", start= startDate,
                               quote="AdjClose", provider="yahoo", origin="1970-01-01",
                               compression="m", retclass="its")
SP500.prices = get.hist.quote(instrument="^gspc", start=startDate,
                                quote="AdjClose", provider="yahoo", origin="1970-01-01",
                                compression="m", retclass="its")

我想将这两个放入具有指定列名的单个数据框中(Pandas 现在允许这样做 - 有点讽刺,因为它们从 R 中获取了 data.frame 概念)。如下所示,我为两个时间序列分配了名称:

MSFTSP500.prices <- data.frame(msft = MSFT.prices, sp500= SP500.prices )

但是,这不会保留[msft, snp500]我指定的列名。我需要在单独的代码行中定义列名:

colnames(MSFTSP500.prices) <- c("msft", "sp500")

我试图把它colnamescol.names里面的data.frame()电话,但它不起作用。创建数据框时如何定义列名?

我发现?data.frame非常无益...

4

2 回答 2

2

代码失败,并显示一条错误消息,指示as.its. 所以我添加了丢失的代码(在两次尝试失败后似乎已经成功。)一旦你发出丢失的require()调用,你就可以使用str来查看get.hist.quote实际返回的对象类型。它既不是数据框也不是动物园对象,尽管它在很多方面都类似于动物园对象:

> str(SP500.prices)
Formal class 'its' [package "its"] with 2 slots
  ..@ .Data: num [1:180, 1] 1394 1366 1499 1452 1421 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr [1:180] "2000-01-02" "2000-01-31" "2000-02-29" "2000-04-02" ...
  .. .. ..$ : chr "AdjClose"
  ..@ dates: POSIXct[1:180], format: "2000-01-02 16:00:00" "2000-01-31 16:00:00" ...

如果你cbind在这两个对象上运行,你会得到一个带有暗名的常规矩阵:

> str(cbind(SP500.prices, MSFT.prices)  )
 num [1:180, 1:2] 1394 1366 1499 1452 1421 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:180] "2000-01-02" "2000-01-31" "2000-02-29" "2000-04-02" ...
  ..$ : chr [1:2] "AdjClose" "AdjClose"

您仍然需要更改列名,因为似乎没有一个cbind.its可以让您分配列名。我会谨慎使用该data.frame方法,因为该对象的行为可能会令人困惑:

> str( MSFTSP500.prices )
'data.frame':   180 obs. of  2 variables:
 $ AdjClose  :Formal class 'AsIs', 'its' [package ""] with 1 slot
  .. ..@ .S3Class: chr  "AsIs" "its"
 $ AdjClose.1:Formal class 'AsIs', 'its' [package ""] with 1 slot
  .. ..@ .S3Class: chr  "AsIs" "its"

这些列仍然是 S4 对象。我想如果您要将它们传递给其他方法,这可能会很有用,its但否则可能会令人困惑。这可能是您拍摄的目的:

> MSFTSP500.prices <- data.frame(msft = as.vector(MSFT.prices), 
                                 sp500= as.vector(SP500.prices) ,
                           row.names= as.character(MSFT.prices@dates) ) 
> str( MSFTSP500.prices )
'data.frame':   180 obs. of  2 variables:
 $ msft : num  35.1 32 38.1 25 22.4 ...
 $ sp500: num  1394 1366 1499 1452 1421 ...
> head(rownames(MSFTSP500.prices))
[1] "2000-01-02 16:00:00" "2000-01-31 16:00:00" "2000-02-29 16:00:00"
[4] "2000-04-02 17:00:00" "2000-04-30 17:00:00" "2000-05-31 17:00:00"
于 2014-12-29T16:04:30.640 回答
1

MSFT.prices 是一个动物园对象,它似乎是一个类似数据框的对象,具有自己的列名,该列名被传输到该对象。授予

tmp <- data.frame(a=1:10)
b <- data.frame(lost=tmp)

它丢失了第二个列名。

如果你这样做

MSFTSP500.prices <- data.frame(msft = as.vector(MSFT.prices), 
     sp500=as.vector(SP500.prices))

然后你会得到你想要的colnames(虽然你不会得到动物园特有的行为)。不过,不确定您为什么反对在第二个命令中重命名列。

于 2014-12-29T15:54:48.977 回答