R dataframe在创建时定义列名

icnyk63a  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(105)

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

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

我想把这两个时间序列放在一个 Dataframe 中,并指定列名(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很没用...

to94eoyn

to94eoyn1#

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

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

7bsow1i62#

prices是一个zoo对象,它看起来像一个数据框架,有自己的列名,该列名被传输到对象

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(虽然你不会得到zoo特定的行为)。

相关问题