【问题标题】:R dataframe define column names at creationR数据框在创建时定义列名
【发布时间】:2015-02-25 19:10:51
【问题描述】:

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

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

【问题讨论】:

  • @BondedDust 那是无效的 R 代码。

标签: r dataframe columnname


【解决方案1】:

代码失败,并显示一条错误消息,指示 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-methods 可能会很有用,但否则可能会造成混淆。这可能是您拍摄的目的:

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

【讨论】:

  • 实际上,如果你不使用its,它会退回到zoo。 YMMV。
【解决方案2】:

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

然后您将获得所需的名称(尽管您不会获得特定于动物园的行为)。不过,不确定您为什么反对在第二个命令中重命名列。

【讨论】:

  • 我认为构造函数应该满足初始化列名的需要。如果我这样做 as.numericas.vector 你是对的,我保留列名,但随后丢失 row.names,即索引。
  • @Zhubarb:我不认为“tseries”的作者希望你在他们的数据对象上使用data.frame-methods。在内部,.Data 核心是一个 R 矩阵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多