【问题标题】:What are the differences between the 'data.frame', 'tribble' and 'tibble' functions? Which is easier and which is more useful for analyzing data?\'data.frame\'、\'tribble\' 和 \'tibble\' 函数之间有什么区别?哪个更容易,哪个对分析数据更有用?
【发布时间】:2022-12-15 07:28:41
【问题描述】:

'data.frame'、'tribble' 和 'tibble' 函数之间有什么区别?哪个更容易,哪个对分析大量数据更有用?我正在创建一个数据框,但我不知道该选择哪个。谢谢!

【问题讨论】:

    标签: r dataframe tidyverse tibble


    【解决方案1】:

    笔记:在这个答案中,我直接从 R 控制台复制了 sn-ps。 > 字符是行的开头不是命令的一部分,它们在那里只是为了表明该行是要键入的命令。

    数据框

    data frame 是一个表,其中每一列可以有不同类型的值。一个例子可以使事情更清楚。

    例如,假设您有关于人的数据:姓名、年龄以及他们是否受雇。我们可以将这些数据放在向量中,例如:

    names <- c('John', 'Sylvia', 'Arthemis')
    age <- c(32, 16, 21)
    employed <- c(TRUE, FALSE, TRUE)
    

    将这些值放在单独的向量中会使处理它们变得困难。数据框允许我们在一列中包含与一个人相关的所有数据。要创建它,我们只需将向量作为参数传递给data.frame(),可选择地给它们命名:

    > df <- data.frame(Name=names, Age=age, Working=employed)
    > df
          Name Age Working
    1     John  32    TRUE
    2   Sylvia  16   FALSE
    3 Arthemis  21    TRUE
    

    请注意现在数据格式更加清晰。使用数据框,许多操作变得更加容易。例如过滤:

    > df[df$Age>20,]
          Name Age Working
    1     John  32    TRUE
    3 Arthemis  21    TRUE
    

    这只是众多例子中的一个。使用数据框,过滤、聚合、绘图等事情变得更加简单。

    从这个意义上说,数据框类似于电子表格或(对于更有经验的开发人员)SQL 表。

    Tibbles

    Tibbles 只是一种新型的数据框。它是非常流行的tidyverse 包集的一部分,并且在几点上与数据框有细微的不同。

    一个显着的区别是它们的打印方式:tibble 格式包含更多信息:

    > t <- tibble(Name=names, Age=age, Working=employed)
    > t
    # A tibble: 3 × 3
      Name       Age Working
      <chr>    <dbl> <lgl>  
    1 John        32 TRUE   
    2 Sylvia      16 FALSE  
    3 Arthemis    21 TRUE 
    

    不过,更重要的是,tibbles 有更少特征比数据框。少做事听起来像是一件坏事,但数据框的某些行为如果在很久以前有用,在今天却很容易出错或令人困惑。例如,您可以通过仅提供列名的开头来从数据框中获取列:

    > df$N
    [1] "John"     "Sylvia"   "Arthemis"
    

    它可能看起来很实用,但如果您在源代码中找到这一行,它可能很难理解。如果您有更多以相同前缀开头的列,它也可能导致错误。

    如果你对 tibbles 这样做,它会返回 NULL 并打印警告:

    > t$N
    NULL
    Warning message:
    Unknown or uninitialised column: `N`. 
    

    同样,这只是冰山一角:还有更多差异。你可以阅读他们on this page,尽管他们中的大多数与年长、更有经验的编码员更相关。

    tribble() 函数

    到目前为止,我们使用函数 tibble() 创建了 tibble 对象。 tribble() 只是创建 tibble 对象的另一种方式。不同之处在于,虽然tibble() 接收向量与data.frame() 非常相似,但tribble() 期望作为参数:

    • 所谓的“波浪符语法”中的列名称;接着
    • 每一行

    无需创建任何矢量。要理解它的含义以及它为什么有用,举个例子会很清楚:

    > t2 <- tribble(
    +   ~Name,       ~Age, ~`Employment status`,
    +   "John",      32,   TRUE,
    +   "Sylvia",    16,   FALSE,
    +   "Arthemis",  21,   TRUE
    + )
    

    注意输入数据时可以看到表格的格式。它非常适合代码中的示例!但不要误会:返回对象等同于tibble() 创建的同一对象:

    > t2
    # A tibble: 3 × 3
      Name       Age `Employment status`
      <chr>    <dbl> <lgl>              
    1 John        32 TRUE               
    2 Sylvia      16 FALSE              
    3 Arthemis    21 TRUE               
    > t == t2
         Name  Age Working
    [1,] TRUE TRUE    TRUE
    [2,] TRUE TRUE    TRUE
    [3,] TRUE TRUE    TRUE
    

    使用哪一个?

    您可以使用任何您喜欢的东西!他们都运作良好。

    如果您不想安装 tidyverse,您可能会使用数据框。现在,如果您正在使用 tidyverse,您可能更喜欢 tibbles,因为它们是这些包的基石。您可能还更喜欢 tibble 以避免混淆数据框行为,或者如果您要将一些输入数据写入您的代码(在这种情况下您可能更喜欢使用 tribble())。

    附录:混合tibble()tribble()

    tibble()tribble() 返回相同类型的对象,但它们具有截然不同的签名。然而,他们的名字真的很相似,所以人们经常混淆他们。注意这一点!

    如果你调用 tibble() 传递 tribble() 参数,你会得到类似这样的错误:

    > t <- tibble(
    +   "John",      32,   TRUE,
    +   "Sylvia",    16,   FALSE,
    +   "Arthemis",  21,   TRUE
    + )
    Error:
    ! Column name `TRUE` must not be duplicated.
    Use .name_repair to specify repair.
    Caused by error in `repaired_names()`:
    ! Names must be unique.
    ✖ These names are duplicated:
      * "TRUE" at locations 3 and 9.
    Run `rlang::last_error()` to see where the error occurred.
    

    如果你调用 tribble() 传递 tibble() 参数,这是你将得到的错误:

    > t <- tribble(Name=names, Age=age, Working=employed)
    Error:
    ! Must specify at least one column using the `~name` syntax.
    Run `rlang::last_error()` to see where the error occurred.
    

    (我发布了这个附录,以便谷歌搜索这个错误的人可以找到这个问答。我花了一个小时试图理解 tibbletribble 之间的区别,或者为什么我会收到那个错误,而且这是一个令人惊讶的无法谷歌话题!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多