我从雅虎获得以下两种资产的月度价值:
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")
我尝试将colnames
和col.names
放入data.frame()
来电,但它不起作用。如何在创建数据框时定义列名?
我发现?data.frame
非常无益......
答案 0 :(得分: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
,你会得到一个带有dimnames的常规矩阵:
> 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"
答案 1 :(得分:1)
MSFT.prices是一个动物园对象,它似乎是一个类似于数据帧的对象,它有自己的列名,它被传递给对象。 Confer
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))
然后你会得到你想要的名字(虽然你不会得到动物园特有的行为)。但不确定为什么你反对在第二个命令中重命名列。