我使用 R 已有多年,有时会遇到由于 data.table 和 tibble 与 data.frame 不兼容而导致的问题。这通常需要在这些数据类型之间执行转换:
这太令人沮丧了!这个设计决定背后的理由是什么?我不明白为什么你不让你的库与基础兼容。看起来你不想让别人使用它,或者他们太傲慢以至于决定强加他们的做事方式。
我想始终使用 data.table 因为它的效率,但这个决定非常令人沮丧,特别是当你想教或吸引人们使用该语言时,特别是当他们不知道如何编程时。你让事情变得更复杂,而不是更容易!至少他们可以提供使用两种语法中任何一种但具有相同背景的机会。
在 Advanced R 中,Hadley 写道
正如您将在第 4 章中学到的,您可以对数据框或数据集进行子集化 tibble 类似于一维结构(其行为类似于列表),或二维 结构(其行为类似于矩阵)。
在我看来,数据框有两种不良的子集行为:
当您使用 df[, vars] 对列进行子集化时,如果 vars 您将得到一个向量 选择一个变量,否则您将得到一个数据框。这是一个 在函数中使用 [ 时经常出现错误,除非你总是 记住使用 df[, vars, drop = FALSE]。
当您尝试使用 df$x 提取单个列并且没有 x 列,数据框将选择以 与 x.如果没有以 x 开头的变量,df$x 将返回 NULL。这 可以很容易地选择错误的变量或选择一个变量 不存在的。
Tibbles 调整这些行为,以便 [ 总是返回一个 tibble, a $ 不进行部分匹配,如果找不到 a 则会发出警告 变量(这就是使 tibbles 粗暴的原因)。
tibble 坚持从 [ 返回数据帧可能会导致 遗留代码的问题,通常使用 df[, "col"] 来提取 单列。如果您想要单列,我建议使用 df[["col"]].这清楚地传达了您的意图,并与 数据框和小标题。
正如我在评论中提到的,
data.table
已在另一篇stackoverflow帖子中得到解决。片段:
正如 FAQ 1.1 所强调的,[.data.table 中的 j 是根本不同的 来自 [.data.frame 中的 j。即使像 DF[,1] 这样简单的东西也会崩溃 许多包和用户代码中的现有代码。这是设计使然,并且 我们希望它以这种方式工作,以便更复杂的语法能够工作。那里 还有其他差异(请参阅常见问题解答 2.17)。
再次强调,一致性是一个关键原因:
DT[3, ] == DT[3],但 DF[ , 3] == DF[3] (在 data.frame 中有些混乱,而 data.table 是一致的)
就像我在第一条评论中提到的那样,
tibble
和data.table
想要连贯一致的行为,例如对它们的类型进行子集化会返回相同的类型。