【问题标题】:Why is as.data.frame ignoring col.names = vector为什么 as.data.frame 忽略 col.names = vector
【发布时间】:2018-03-01 19:56:29
【问题描述】:

我固执地试图在一行中创建一个具有命名行和列的数据框。我意识到我可以通过使用 colnames(forecast) 轻松做到这一点,但我想简化一下,如果只是为了证明我可以做到。

以下不起作用--没有错误,但未设置列名

forecast <- as.data.frame(cbind(c(1, 32, 60, 91, 121, 152,
                                182, 213, 244, 274, 305, 335),
                                c(31, 59, 90, 120, 151, 181,
                                212, 243, 273, 304, 334, 365),
                                as.vector(rep(0, times=12))),
                                row.names = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", 
                                               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),
                                col.names = c("Start", "End", "forecast"))


> forecast
     V1  V2 V3
Jan   1  31  0
Feb  32  59  0
Mar  60  90  0
Apr  91 120  0
May 121 151  0
Jun 152 181  0
Jul 182 212  0
Aug 213 243  0
Sep 244 273  0
Oct 274 304  0
Nov 305 334  0
Dec 335 365  0

以下确实可以按需要工作。

forecast <- setNames(data.frame(cbind(c(1, 32, 60, 91, 121, 152,
                                      182, 213, 244, 274, 305, 335),
                                      c(31, 59, 90, 120, 151, 181,
                                      212, 243, 273, 304, 334, 365),
                                      as.vector(rep(0, times=12))),
                                      row.names = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", 
                                                "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")),
                                      c("Start", "End", "forecast"))

> forecast
    Start End forecast
Jan     1  31        0
Feb    32  59        0
Mar    60  90        0
Apr    91 120        0
May   121 151        0
Jun   152 181        0
Jul   182 212        0
Aug   213 243        0
Sep   244 273        0
Oct   274 304        0
Nov   305 334        0
Dec   335 365        0

不得不嵌套在另一个函数中似乎很奇怪。在 as.data.frame 文档中,它说使用 col.names = names(x)。这是否意味着它只能从输入对象生成名称?

【问题讨论】:

  • 这是什么语言? (“DataFrames”是一个存在于许多语言中的概念,例如 R、Julia 和 Python。这对我来说看起来像 R,但我从未真正使用过 R,所以我真的只是在猜测......)
  • 对不起。这是在 R 中。
  • 为什么不直接:data.frame(Start = c(1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335), End= c(31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365), forecast = as.vector(rep(0, times=12)), row.names = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))
  • @tushaR--谢谢,成功了。

标签: r dataframe


【解决方案1】:

数据的类是矩阵:

d <- cbind(c(1, 32, 60, 91, 121, 152,
                            182, 213, 244, 274, 305, 335),
                            c(31, 59, 90, 120, 151, 181,
                            212, 243, 273, 304, 334, 365),
                            as.vector(rep(0, times=12)))
is.matrix(d)
# TRUE

如果查看as.data.frame使用的方法,如下:

## S3 method for class 'character'
as.data.frame(x, ...,
              stringsAsFactors = default.stringsAsFactors())

## S3 method for class 'list'
as.data.frame(x, row.names = NULL, optional = FALSE, ...,
              cut.names = FALSE, col.names = names(x), fix.empty.names = TRUE,
              stringsAsFactors = default.stringsAsFactors())

## S3 method for class 'matrix'
as.data.frame(x, row.names = NULL, optional = FALSE,
              make.names = TRUE, ...,
              stringsAsFactors = default.stringsAsFactors())

您可以看到选项col.names 只能在命名列表对象中使用。您只需将 cbind() 更改为 list() 即可使其工作:

forecast <- as.data.frame(list(c(1, 32, 60, 91, 121, 152,
                                182, 213, 244, 274, 305, 335),
                                c(31, 59, 90, 120, 151, 181,
                                212, 243, 273, 304, 334, 365),
                                as.vector(rep(0, times=12))),
                                row.names = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", 
                                               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),
                                col.names = c("Start", "End", "forecast"))

#     Start End forecast
# Jan     1  31        0
# Feb    32  59        0
# Mar    60  90        0
# Apr    91 120        0
# May   121 151        0
# Jun   152 181        0
# Jul   182 212        0
# Aug   213 243        0
# Sep   244 273        0
# Oct   274 304        0
# Nov   305 334        0
# Dec   335 365        0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2019-03-22
    • 2017-07-07
    • 2012-01-30
    • 2021-02-17
    • 1970-01-01
    相关资源
    最近更新 更多