Data.table: 小插曲

创建于 2014-11-11  ·  54评论  ·  资料来源: Rdatatable/data.table

HTML 插图系列:

计划v1.9.8

  • [ ] data.table 快速浏览
  • [x] [键和基于快速二进制搜索的子集](https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-keys-fast-subset.html)
  • [x] [二级索引和自动索引](https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-secondary-indices-and-auto-indexing.html)
  • []加入小插图。 a) _joins_ vs _subsets_——将基于二分搜索的子集扩展到连接+条件/非等连接、滚动和间隔连接。 b) by=.EACHI,加入+更新功能。 c) 将i.col用法记录在 #1038 中。 d) 还介绍了 #1232 中的性能/优势。
  • [ ] 涵盖get()mget()
  • [ ] 在 FAQ (#1623) 中添加关于 on= 参数的基本原理。
  • [ ] FAQ 5.3 需要提到它是一个_浅_副本,是为了恢复过度分配而完成的。 感谢 Jan 在 #1729 中链接它。

未来版本

  • [ ] data.table 内部结构、性能方面和 _expressiveness_
  • [ ] 读取多个文件( fread + rbindlist ),排序,排序和设置操作
  • [ ] IDateTime 插图
  • [ ] 在某处记录data.table()data.frame()之间的区别 - 相关问题:#968、#877。 也许在常见问题解答中稍微详细一点。
  • [ ] coursera 常见问题
  • [ ] 高级data.table用法:

    • [ ] NSE

    • [ ] ...

  • [ ] 时间小插图(将 #520 移到此处以将所有内容放在一个地方,但不确定我们是否需要将其作为小插图,因为我们有带有基准测试/时间的 Wiki)。
  • [ ] fread+fwrite小插图,还包括fread wiki 的https://github.com/Rdatatable/data.table/issues/2855

完成的:

  • [x] [data.table 简介](https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-intro-vignette.html) - data.table 语法,一般形式, i子集行byj和聚合中选择/执行。
  • [x] [Reference Semantics](https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-reference-semantics.html)(_add/update/delete_列引用,看我们可以结合与iby以与以前相同的方式)
  • [x] [使用 data.tables 的高效重塑](https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-reshape.html)
  • [x] 在by=.EACHI上链接到这个答案,直到小插图完成。

次要的:

  • [ ] 使用integer64 ,并将其提升为 _large integers_。

注释(根据反馈更新当前的小插曲):如果我错过了什么,请告诉我..

data.table 介绍:

  • [x] orderi
  • [x] 解释如何在选择/计算时j列命名。
  • [x] 强调_keyby_ 是在_after_ 获得计算结果后应用的,而不是在原始data.table 上。
  • [x] 在with=FALSE中提到.SDcols和 cols 的新更新,可以将列选择为colA:colB

    参考语义:

  • [ ] 还要在这里解释所有其他相关的set*函数.. ( setnames , setcolorder等等..)

  • [ ] 主要是set
  • [x] 解释1b) the := operator只是定义了使用它的方式-那里的示例不起作用,因为它仅显示了两种不同的使用方式-遵循此评论

    基于键和快速二分搜索的子集:

  • [ ] 添加一个使用整数/双键的子集示例。

  • [ ] 基于二分搜索的子集中“nomatch”默认值的差异。
  • [] 用基于二进制搜索的子集替换 NA 可能吗?

    常见问题解答(我认为在这里最合适)。

  • [x] 更新常见问题解答,解决从文件读取 R 对象时外部指针为 NULL 的问题,例如,使用readRDS() 。 更新此 SO 帖子

  • [ ] 举例说明,使用alloc.col()过度分配 data.table,以及何时使用它(当您需要创建多个列时),以及为什么。 更新此 SO 帖子
documentation internals

所有54条评论

fread是最不值得一提的。
以上几点主要与数据转换有关, fread更像是一种数据提取,因此可能会在此类小插图中被跳过,但 IMO 值得一提的是此类data.table功能。

编辑:您将使用哪一个:Rnw 或 Rmd?

同意,更新。

我很好奇是什么让感冒比说tapply更快。 答案的一部分是 gforce,但是用户编写的函数呢? 我找不到任何关于此的信息。 有一篇关于熊猫的好文章: http ://wesmckinney.com/blog/?p=
甚至可以将其与sapply 。 例如,假设我从一个向量列表开始。 将所有向量附加到 data.table 的一列中并使用by而不是sapply是否值得?

@matthieugomez有趣的问题! 也很好地涵盖了这一点。 让他们来:-)。

我有兴趣了解 IDateTime 及其一些用例。

@gsee更新了。

作为 R 和 data.table 的新手(自 3 月以来),我会说需要有一个基本的面向结果的介绍,而不是当前面向功能的介绍。 换句话说,阅读 data.table 中每个参数的作用是一回事,但如果没有考虑用例,它们通常没有什么意义。 虽然有输出的例子,但许多人需要走向另一个方向。 也就是说,他们知道他们需要什么输出,但他们不知道什么功能/参数/设置最适合使用。 有一个简单的食谱方法来让他们开始会很有帮助。

如何创建数据的子集?
如何对数据的子集进行操作以创建新的或更新的数据集?
如何添加新列?
如何删除列?
如何创建单个变量?
如何创建多个变量?
如何对数据的不同子集进行不同的操作? (。经过)
如何在函数中使用 data.table 并传入 data.table 名称和要操作的列?
如何对同一个 data.table 执行多个顺序操作?
我可以选择一个数据子集并同时对其进行操作吗?
我什么时候需要注意通过引用创建/更新变量?
如何为每组选择一个观察结果(第一个,最后一个)?
如何设置键,它与设置索引有什么不同?
当我对 data.table 进行操作时,我的密钥在什么情况下会被删除?
我可以只使用常规的“合并”语法还是需要使用 data.table 语法 (Y[X])?
如何将列表列表折叠到一个大 data.table 中? 如果列的顺序不同怎么办?

SO 上可能还有大量其他项目可以编辑为简单的问题和答案汇编。

@markdanese感谢您的建议。 这些都很棒,但可能作为一个单独的 wiki,因为它们对某些任务非常挑剔。 小插图的目的是介绍 data.table 语法,说明它是多么灵活和强大,以便您能够自己完成这些任务。

我现在正在写小插曲(尽可能快),格式或多或少以这种方式(问答)并用示例解释答案。 一旦我完成了第一个小插图,我打算将它张贴在这里以获得一些反馈.. 知道你的想法也很棒。

再次感谢。

维基页面思想的进一步扩展: http://www.ats.ucla.edu/stat/r/ 上列出的常见问题解答和代码片段(高级)链接可能是将 R 中的传统任务与数据进行对比的有用资源.table方式。 我在一篇博客文章 (http://vijaylulla.com/wp/2014/11/12/grouping-in-r-using-data-table/) 中做了类似的事情来展示给我的同事。 对不起,无耻的自我宣传。

我已经完成了 _Introduction to data.table_ 小插图(请参阅顶部的链接)。 很高兴知道您的想法。

感谢@jangorecki@brodieG提供了很好的反馈,当然还有@mattdowle :-)。

这真的很棒。 希望在一年前我开始使用 data.table 时它就存在了。 以下几件小事供您考虑:
您可能想提一下,您可以在最后的摘要中对i进行排序(通过order )。 你也可以在开头提到这一点。 您还可以提到在i中可以完成更复杂的连接,这些连接涉及未涵盖的键。 这允许您提及i的主要功能,以便读者在需要时可以查找更高级的功能。 您可以稍后超链接到它们。

在 .SD 部分你写“那个组”,但可能更清楚地说“使用by定义的组”。 这也是稍后完成的。

我可能已经错过了它,但最好更清楚一点, .SDby本质上将数据限制为 .SD 列,然后创建一组 data.tables by变量的每个唯一组合。 然后它使用j的函数按照by变量的顺序处理这些 data.tables。 您甚至可以提到有一些特殊符号允许用户访问作为该处理的一部分生成的某些索引,但这些超出了介绍小插图的范围。

同样,这些只是建议。 非常感谢您(和马特)的辛勤工作。

2015 年 1 月 17 日星期六下午 6:22,Mark Danese通知@github.com
写道:

这真的很棒。 希望它在一年前我开始使用时就存在
数据表。 以下几件小事供您考虑:

谢谢你。

您可能想提到您可以在 i 中排序(通过订单)
总结在最后。 你也可以在开头提到这一点。

哦啪! 很棒的一点。 我应该在开头添加“order(..)”,然后
也将添加到摘要中。

您还可以提到可以使用更复杂的连接
在涉及未涵盖的键的 i 中完成。 这允许你提到
i 的主要功能以便读者查找更高级的
如果他们需要他们的功能。

对,会做。

您可以稍后超链接到它们。

那,我不确定……因为这些是要推送到 CRAN 的,而且
在维基上..

在 .SD 部分你写“那个组”,但可能更清楚
说“使用 by 定义的那个组”。 这也是稍后完成的
好。

我以为我将其编辑为“当前组”,但显然不是......“由
使用by定义的当前组 - 听起来如何?

我可能错过了,但最好能更清楚一点
.SD with by 本质上将数据限制为 .SD 列,然后
为每个唯一的变量组合创建一组 data.tables
在通过。 然后它按照 by 的顺序处理这些 data.tables
使用 j 中的函数的变量。

我想你错过了。 它就在块引用的下方,其中 .SD 是
解释(在第 2e 节中)。 它准确地解释了您在这里提到的内容......

你甚至可以提到有一些特殊的符号可以让用户
访问作为该处理的一部分生成的一些索引,但是
这些超出了介绍小插图的范围。

对..这就是不引入其他特殊符号的原因。

同样,这些只是建议。 你的辛勤工作(和马特的)非常重要
赞赏。

很棒的建议。 一旦我上传了其他小插曲,我会回信。


直接回复此邮件或在 GitHub 上查看
https://github.com/Rdatatable/data.table/issues/944#issuecomment -70375167
.

那,我不确定……因为这些是要推送到 CRAN 的,而且
在维基上..

AFAIK 当您将包推送到包含Rmd vignettes目录中的Rmd CRAN 时,它们将自动构建以检查构建小插图是否成功,但 CRAN 中的源代码将包含由以下人员构建的小插图(html)您,而不是来自 CRAN 构建/检查的人。
CRAN 是小插图的好地方,因为对于许多用户来说,它是寻找文档/教程的第一个地方,所以我认为在 CRAN 中拥有它们是值得的。

您可以稍后超链接到它们。

那,我不确定.. 因为这些是要推送到 CRAN 的,还有 WIKI ..

单个文件夹链接在 CRAN 上不起作用吗? 我实际上并没有在那里放任何东西,但是这个小插图通过使用相对链接将多个其他

更新了 _Reference Semantics_ 小插图。

再次感谢您所做的一切。

还有一个关于小插图的建议——在你自己的函数中使用 data.table 。 不是编写包,而是尝试自动化一些常见任务。 有一些技巧我还没有完全弄清楚。 此外,如果某个地方有关于此主题的帖子,将不胜感激。

最后,列出“有用”堆栈溢出帖子的小插图可能对您不想包含在小插图中的主题有所帮助。

只是一些随意的想法。

两个想法:

  • 链接到 wiki 中的小插图
  • 在参考语义小插图中,添加如何将 := 与带引号的列表表达式(或仅带引号的赋值)一起使用。 也许这值得拥有自己的小插图,因为 data.table 中的 NSE(非标准评估)简化了交互式使用,但要求在您自己的函数或包中使用 data.table,您现在应该了解一些关于引用、评估、替代和朋友的信息。 也许只需将 dt[, do.call(":=", eval(my_quoted_list)] 之类的内容添加到小插图中,然后在 NSE 及其含义上创建一个小插图?

谢谢。

  1. 你见过这个吗?
  2. 这很可能会包含在单独的小插图中。 但还没有计划。

@arunsrinivasan不,我没见过,太棒了! 另一个书签

更新了 _Keys 和基于快速二进制搜索的子集_小插图。

非常好。 我喜欢这些小插曲。 只是一些快速评论供考虑。

如果不使用行名称,接管行名称的目的是什么? 或者它们是否被 j 中的特殊运算符使用(如 .N、.I 等)? 我认为它们被 data.table 使用,但不是作为索引使用。 我一直对强制编号行名称的目的感到困惑。

为什么只访问第二个时在第一个键中使用unique ? 如果你不这样做,你会在输出中得到很多重复的行,对吗? 也许很明显,但如果你不这样做,说/展示会发生什么可能会有所帮助。

是否需要引用所有键? 甚至数字(整数)的? 您可以使用数字作为键吗? 有什么需要注意的吗?

如果您的键列中有 NA 怎么办? 您可以搜索并替换它们吗(就像您在示例中所做的那样,将 24 替换为 0?

可能有助于解释keyby适用于 _output_ data.table (在您的示例中ans )而不是输入 data.table (在您的示例中flights )。

您可以将向量传递给密钥吗? 换句话说,您可以在靠近底部的示例中直接在i中创建airport <- c("LGA", "JFK", "EWR")并使用airport吗? 这可能有助于建立将不同的 data.table 传入进行合并的想法。

关于“对应”(“correspondong”)的错别字。 在向量扫描部分中缺少一个后记号,您在其中编写“与 origin == "LGA" anddest == "TPA"` 对应的行索引是使用基于键的子集获得的。”

@markdanese关于

为什么在只访问第二个时在第一个键中使用 unique ?

flights[.(unique(origin), "MIA")]

不确定您是否非常希望提出更好的解释,或者您不知道多列键的更复杂用法。
当您的键是c(origin, dest) ,您不能简单地在dest上使用二分搜索,您应该让c(dest, origin)dest上使用二分搜索。 使用.(unique(origin), "MIA")使用二进制搜索,通过为 key 中的第一列提供所有可用值,然后将选择性值提供给第二列。
我做了一个扩展,只使用键中的选择性列。 看个简单的例子也可以帮助你理解。 我的扩展还没有准备好成为 data.table master 的 PR,因为如果使用内部 data.table 函数/结合 data.table 辅助键开发,内存使用的扩展性不如它。

您可以使用数字作为键吗?

您可以使用数字作为键,它在Keys and their properties部分中提到。

有什么需要注意的吗?

不确定,但setNumericRounding会影响数字键,可能在小插图中值得一提。

如果您的键列中有 NA 怎么办? 你能搜索这些并替换吗

是的, is.na()被优化为使用二分查找。 试试data.table(a=c(1,NA_real_),b=c("a","b"),key="a")[.(NA_real_), .SD ,verbose=TRUE]

还有@arunsrinivasan中的错字:

找到匹配的值

谢谢 Jan - 这真的很有帮助。 我提供了这些问题,作为可以在小插图中简要提及的内容,以帮助新用户了解正在发生的事情。 它们是在阅读文档时想到的(作为一个相当新的用户)。 我无法真正为代码做出贡献,因此我希望通过帮助编写文档来做出贡献。

2015 年 1 月 23 日星期五晚上 8:48,Mark Danese通知@github.com
写道:

非常好。 我喜欢这些小插曲。 只是一些快速评论
考虑。

如果不使用行名称,接管行名称的目的是什么? 或者是
它们被 j 中的特殊运算符使用(如 .N、.I 等)? 我觉得他们
由 data.table 使用,但不用作索引。 我一直都是
被强制编号行名称的目的混淆。

第 1a 节,就在 Keys 及其属性上方,对此有答案。
Data.tables _inherit_ 来自 data.frames。

为什么在只访问第二个时在第一个键中使用 unique ? 如果你
不要,你会在输出中得到很多重复的行,对吧? 也许显而易见,
但如果你不这样做,说/展示会发生什么可能会有所帮助。

同样,这在下面的“这里发生了什么?”中得到了准确解释。 一世
甚至可以参考我为以下内容奠定基础的上一节
解释这个。

是否需要引用所有键? 甚至数字(整数)的? 你能用一个
数字作为键? 有什么需要注意的吗?

有一个在 2d 上带有整数列的示例。 我以为是
充足的?

如果您的键列中有 NA 怎么办? 你能搜索这些并替换吗
它们(就像您在示例中所做的那样,将 24 替换为 0?

好点子。 这与矢量扫描不同。 将尝试添加这个。

这可能有助于解释 keyby 适用于 _output_ data.table (
ans 在你的例子中)而不是输入 data.table (航班在你的
例子)。

'keyby' 已经在第一个小插图中讨论过。 但我会看看这是否
可以添加。

您可以将向量传递给密钥吗? 换句话说,你能不能创建机场
<- c("LGA", "JFK", "EWR") and useairportdirectly ini` 在你的例子中
底部? 这可能有助于建立传递不同的想法
data.table 用于合并。

下一节的内容。 这就是我们过渡到连接的方式。

关于“对应”(“correspondong”)的错别字。 后记之一是
在您编写“行索引”的向量扫描部分中丢失
对应origin == "LGA" anddest == "TPA"` 使用key获取
基于子集。”

谢谢。


直接回复此邮件或在 GitHub 上查看
https://github.com/Rdatatable/data.table/issues/944#issuecomment -71253738
.

在这些小插曲上做得很好!
我的评论可能迟到或已经涵盖:

  • 我想看到使用动态行和列的各种方式/示例。
  • 对合并和连接进行更广泛的比较。
  • 使用set不同/更丰富的方法。 此外,很高兴看到解释为什么以下确实会出错(请参阅此处):
for (j in  valCols)
   set(dt_,  
    i = which(is.na(dt_[[j]])),
    j = j, 
    value= as.numeric(originTable[[j]]))

Wiki添加了Reshape 小插图

出色的功能和小插图! 谢谢阿伦

在星期二,2015年6月23日,21:02阿伦[email protected]写道:

添加了重塑小插图
https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-reshape.html
到 Wiki https://github.com/Rdatatable/data.table/wiki/Getting-started。


直接回复此邮件或在 GitHub 上查看
https://github.com/Rdatatable/data.table/issues/944#issuecomment -114678716
.

patterns人会很好。 很棒的小插图

使用这些命令不需要加载 reshape2 吗? 如果是这样,那么应该提到这一点。 我真的很喜欢对“宽到长”和“长到宽”的关注。 我绝对讨厌 reshape2 的语法(例如,我认为“make_wide”比“dcast”清楚得多)。 出于这个原因,我不会将节标题写为“熔化 data.tables”和“casting data.tables”。 这仅对熟悉 reshape2 包的人有意义。 我可能会从更通用的标题开始(“从长到宽”)。

对于它的价值,我无法使用仅加载 data.table 的新 R 会话来运行小插图的第一行。 我不知道为什么(也许模式应该是“w”而不是“wb”),但是
DT = fread("https://raw.githubusercontent.com/wiki/Rdatatable/data.table/data/melt_default.csv")
返回
Error in download.file(input, tt, mode = "wb") : unsupported URL scheme

一如既往,感谢您这样做。 这真的很有用。

@markdanese感谢您的出色反馈。

  1. reshape2 data.table v1.9.6不需要reshape2 data.table v1.9.6 。 也在小插图中更新了这一点。
  2. 在标题和其他地方添加了“宽到长”和“长到宽”,以避免对这个主题的新手造成混淆。
  3. https在功能fread在devel的版本中实现。 因此,您还无法使用v1.9.4运行该代码。 要么更新,要么等一下:-)。

谢谢你的鼓励。

@jangorecki patterns()不会被导出。 用法将扩展为[.data.table用于选择列, :=.SDcols等。

@arunsrinivasan仍然是patterns的手册可能会有所帮助,就像:= 。 只是因为很多人(我认为)使用?fun来理解他们阅读的代码。

在 _join_ 小插图中,可能值得添加 data.table 连接的相应 SQL 示例,以便数据库人员更容易获取。
例如可以在 SO How to join (merge) data frames (inner, external, left, right)? 中找到相应 SQL 语句的示例

有一些“难民”小插曲也会很酷——

  • data.table用于Stata用户
  • data.table用于SQL用户
  • data.table用于Matlab用户
  • data.table用于Python / pandas用户
  • 甚至data.table对于dplyr用户

等等。就像一个快速入门指南,但面向移民。

添加了Secondary indices and auto indexing小插图。 这应该允许从子集平滑过渡到我将处理的下一个小插图的连接。

@arunsrinivasan不使用与 _indices_ 相关的

@jangorecki我认为“次要”对于它与键(主要)的关系很有用,也许:

二次排序

有更好的描述吗?

但是已经使用了_index_这个词,它看起来比_secondary sort_ 更好看:)

所以你会把它命名为“自动索引”? IMO“二级排序和自动索引”感觉信息量更大

_auto_ 可能在某种程度上具有误导性,因为索引应该适用于 _auto_ 创建索引,也适用于手动创建的索引 - #1422 解决当前的限制。

我知道了。 我仍然缺少您首选的替代方案——只是“指数”?

不完美但优于_二级索引_

我非常喜欢这个最新的小插图。 我唯一的想法是提及哪些类型的操作会导致索引被删除可能会有所帮助。 从我的测试来看,几乎任何改变行数的东西,或任何涉及索引列的操作。

我认为“on”的例子真的很有帮助。

@markdanese好点,会补充。

感谢您发布 v1.9.8 时更新的小插曲。
“参考语义”指的是copy()函数及其制作浅拷贝的新功能(尤其是在函数内部,我真正感兴趣的东西):

“但是,我们可以通过浅复制而不是深复制来进一步改进此功能。事实上,我们非常希望为 v1.9.8 提供此功能。我们将在 data.table 设计小插图中再次对此进行修改。”

但是缺少设计插图,链接指向一个老问题。 参考手册没有提供比小插图中提供的更多的关于copy()的信息。 其余的小插曲不提供有关copy任何信息。

这个小插图会很快上市吗?

+1 用于内部小插图。 我(我猜还有其他一些人)对在 C 方面做出一点贡献很感兴趣,但我有点被(就目前而言)35k 行 C 代码吓到了......它单独' - 内部结构的介绍可以创造奇迹!

想要插话并询问是否接受非代码贡献者(如我)对小插图的贡献。 我对加入小插图特别感兴趣,因为我最初遇到了很多麻烦,并从 Arun 在 Stackoverflow 上的答案中得到了解决方案的指导,如果允许的话,我想要一些关于如何这样做的指导。

@arunsrinivasan我看到你有一个观点IDateTime vignette 。 也许它可以包含在@jangorecki建议的更一般的小插图中:小插图:时间序列-有序观察

此外,我正在准备关于 jan 建议的一些主题的初稿。 也许它的一部分也可能与加入小插图有关? 如果有人觉得它有用,我很乐意分享。

@zeomal这样的贡献将是非常有价值的,非常感谢!

@MichaelChirico ,谢谢。 @Henrik-P,您对正常连接的简要介绍是否全面 - 即您会更关注时间序列吗? 如果没有,我可以开始研究它 - 我还没有使用过滚动连接,所以那里不知道。 :)

@zeomal希望我能尽快上传初稿,所以你可以看看。 在我的草稿中,我提供了一个简单的示例,说明在单个变量 time 上进行“正常”连接,其中存在不匹配的行。 我使用nomatch = NA 。 (maaaybe 也是nomatch = NULL一个简单示例)

我的想法是,这个简单的连接可以提供问题的上下文和感觉,然后我会在以下关于滚动和非对等连接等的部分中更彻底地处理这些问题。

非常感谢您愿意做出贡献! .

在准备小插曲时,我有一个关于通过引用加入的问题。 X[Y, new_col := old_col]X上执行类似于传统左连接的操作。 然而,如果有多个匹配Y的在键X ,只有最后一次(或第一个?)匹配的键的值被保留。 这是在某处明确记录的吗? 当我遇到它时,我曾尝试搜索它,但因此不得不求助于我对引用更新的理解。 对于可重现的示例,

> X = data.table(a = c(1, 2, 3), m = c("a", "b", "c"))
> Y = data.table(b = c(1, 1, 4), n = c("x", "y", "z"))
> X[Y, new_col := i.n, on = "a == b"]
   a m new_col
1: 1 a       y
2: 2 b    <NA>
3: 3 c    <NA>

# an ideal left join - expected behaviour per a new user, given below
# not possible because updating row by reference isn't implemented
   a m new_col
1: 1 a       x
1: 1 a       y
2: 2 b    <NA>
3: 3 c    <NA>

这是预期的行为,但对于新用户来说并不完全简单。 mult也不影响输出。 关于我如何记录这个的任何建议? 添加merge作为正确左连接的解决方法?

@zeomal请在#2181 问题中发布有关加入小插图的未来问题。 这似乎是更好的地方。 它记录在set

@zeomal如果您想查看我对正常(equi)连接的处理有多简短,我只想让您知道我在时间序列小插图上发布

此页面是否有帮助?
0 / 5 - 0 等级