【问题标题】:dplyr/r make class spec_tbl_dfdplyr/r 制作类 spec_tbl_df
【发布时间】:2019-06-12 20:16:38
【问题描述】:

我正在尝试运行一行代码来读取超过 55 列。其中20个与其他城市有距离。此代码查找最短距离并使用距该位置最短距离的城市名称填充新列。我在两个几乎相同的数据集上运行代码,除了第一个比第二个有更多的列。

Enrollment_Report$nearest_hub <- hub_locations_list$hub_loc[apply(Enrollment_Report[grep("^dist", names(Enrollment_Report))], 1, which.min)]

它会产生此错误,但仅限于第一个数据集:

  invalid subscript type 'list'

问题在于此代码适用于一个数据集,而不适用于另一个数据集。代码没有错别字,使用第一个数据集,类看起来像:

class(Enrollment_Report)
[1] "tbl_df"     "tbl"        "data.frame"

但是代码所处理的第二个数据集是这个类:

class(all_employee_locations)
[1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame"

我的问题:如何让第一个数据集成为类 spec_tbl_df?我不知道为什么 R 会以这种方式自动读取第二个数据集,而且我找不到任何函数让它以这种方式读取它。

让这个类显式很重要,因为这段代码从工作变为突然不工作(即使在重置我的会话之后)。

【问题讨论】:

  • 你有没有从readr读到read_csv/read_delim的数据集之一
  • @akrun,是的! 工作的那个是用 read_excel 读入的,而工作的那个是用 read_csv 读入的。有没有办法让 read_excel 将其作为 spec_tbl_df 读入?
  • @akrun,更新:我做了一个解决方法,将文件作为 excel 读取,然后将其写入 csv 并使用 readr 读取。这确实将文件更改为类spec_df_tbl;但是,它仍然不会读取此数据集的代码。
  • @MrFlick,我同意,但我不知道这些数据集是什么使它成为列表而不是另一个,特别是当它们都没有产生类列表时,并且当即使使用 unlist(),代码也会失败。不幸的是,我无法发布数据集,因为它是专有的,而且因为我不知道它为什么会产生错误,所以我不知道如何使其可重现。

标签: r class dataframe dplyr tibble


【解决方案1】:

最终更新,这最终起作用了:

它是否是类 spec_tbl_df 无关紧要。我的 tibble 的一排有很多 NA。出于某种原因,R 感到困惑,并认为 tibble 是一个列表(尽管 class(dataset) 再次产生了 tbl)。删除主要是 NA 的行允许代码工作。

为了将来的参考,如果你确实需要你的数据集是类 spec_tbl_df,那么@Akrun 是正确的,这是 readr 与 readxl 的副产品。 read_csv 将数据集作为 spec_tbl_df 读取,而 read_excel 只是将它们作为 tibbles 读取。

出于某种原因,如果您需要它是类 spec_tbl_df,我的解决方法是将文件作为 Excel 文件读入,将其写入为 csv,然后使用 read_csv 将其读回。这使它成为 spec_tbl_df 类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2017-03-27
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    相关资源
    最近更新 更多