R dataframe在创建时定义列名

时间:2014-12-29 15:26:27

标签: r dataframe columnname

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

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非常无益......

2 个答案:

答案 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))

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