【问题标题】:Initialise a complete empty data frame (no rows, no columns) [duplicate]初始化一个完整的空数据框(没有行,没有列)[重复]
【发布时间】:2016-10-06 17:54:46
【问题描述】:

这是创建一个没有行和没有列的空数据框的技巧:

iris[FALSE, FALSE]
#> data frame with 0 columns and 0 rows

看起来更聪明的代码会创建一个虚假的列:

x <- list(NULL)
class(x) <- c("data.frame")
attr(x, "row.names") <- integer(0)
str(x)
#> 'data.frame':    0 obs. of  1 variable:
#>  $ : NULL

是否有非黑客替代方案?

创建这样一个东西的原因是为了满足一个可以处理空数据帧但不能处理 NULL 的函数。

这与类似的问题不同,因为它没有列也没有行。

【问题讨论】:

  • 但是这个问题是关于指定列类型的。
  • structure(list(),class="data.frame") 是一种尝试将类添加到列表中的原始方法。
  • 我不认为这是重复的
  • OP 说他们正在尝试“满足一个可以处理空数据帧但不能处理 NULL 的函数”......如果 OP 是编写函数的人,那么我可以建议他们从错误的一面?测试inherits(x, "data.frame") 怎么样?这将通过data.frame(是否为空),但对于NULL 将失败。如果他们试图将数据传递到现有函数中,那么 data.frame() 应该绕过测试(很可能是上述测试)。
  • @JonathanCarroll OP 正试图在 tidyr 包中满足 unnest ;)

标签: r dataframe


【解决方案1】:
df <- data.frame()
str(df)
'data.frame':   0 obs. of  0 variables

【讨论】:

  • 我怎么没想到?
【解决方案2】:
empty.data.frame <- function() {
  structure(NULL,
            names = character(0),
            row.names = integer(0),
            class = "data.frame")
}
empty.data.frame()
#> data frame with 0 columns and 0 rows

# thelatemail's suggestion in a comment (fastest)
empty.data.frame2 <- function() {
  structure(NULL, class="data.frame")
}

library(microbenchmark)
microbenchmark(data.frame(), empty.data.frame(), empty.data.frame2())
#> Unit: microseconds
#>                 expr    min      lq     mean median     uq    max neval
#>         data.frame() 12.831 13.4485 15.18162 13.879 14.378 65.967   100
#>   empty.data.frame()  8.323  9.0515  9.76106  9.363  9.732 19.427   100
#>  empty.data.frame2()  5.884  6.9650  7.63442  7.240  7.540 17.746   100

【讨论】:

  • 性能真的是个问题吗?唯一可能的缩放是重复。
  • @JonathanCarroll 你将如何缩放一个空数据框?
  • @PierreLafortune 这就是我的观点。无论您采用哪种方式,这都不会是一个昂贵的程序。你可能会这样做很多次(在一些奇怪的情况下),但即使那样它也不慢。
  • 他的测试最有可能是为了了解哪个函数调用以最少的内部动作到达了重点。
  • “最少内部移动”——准确地说,是为了尽可能接近像“int a;”这样的变量声明。我应该在问题中这么说。在实践中,创建并复制它要快得多。
猜你喜欢
  • 2018-01-13
  • 1970-01-01
  • 2014-05-17
  • 2011-08-09
  • 2017-01-31
  • 2018-01-27
  • 2021-10-20
  • 2016-09-10
  • 1970-01-01
相关资源
最近更新 更多