data.table 设置 key 时如何对字符串进行排序

2023-11-25

昨天我不得不花一些时间试图找到我的代码中的错误,我发现data.tablepackage 对字符串的排序方式与 base 略有不同。这是正常行为吗?最有效的方法是什么(其优点是data.table)重现使用碱基获得的结果order功能?这是一个可重现的玩具示例:

library(data.table)
options(stringsAsFactors = FALSE)

d <- data.frame(cn=c("USA","Ubuntu","Uzbekistan"))
d[order(d$cn),,drop=F]

#          cn
#2     Ubuntu
#1        USA
#3 Uzbekistan

dt <- data.table(d)
setkey(dt, cn)
dt

#           cn
#1:        USA
#2:     Ubuntu
#3: Uzbekistan

options(stringsAsFactors = default.stringsAsFactors())

操作系统 Windows 7


2014 年 3 月更新

关于这一点存在一些争论。从 v1.9.2 开始,我们暂时解决了setkey使用 C 语言环境进行排序;例如,无论用户的区域设置如何,所有大写字母都位于所有小写字母之前。这是 v1.8.8 中所做的更改,我们原本打算撤销该更改,但目前仍保留该更改。

考虑save()- 在您所在地区和同事中创建一个键控表load()- 在不同的语言环境中使用它。当它们加入该表时,如果它是区域设置排序顺序,则它可能不再正常工作。我们必须更仔细地考虑一下,如果setkey是允许再次进行语言环境排序,可能是通过将语言环境名称与“已排序”属性一起保存,所以data.table至少可以比较并检测当前区域设置是否与运行的区域设置不同setkey.

这也是出于速度原因,因为根据语言环境进行排序比 C 语言环境慢得多。尽管如此,我们可以尽可能高效地做到这一点,并且有选择地允许它是理想的。

因此,这现在是一个功能请求,非常欢迎进一步的评论。

FR#4842 setkey 使用会话的语言环境而不是 C 语言环境进行排序



不错的收获!致电给setkey依次调用setkeyv这就是所谓的fastorder对依次调用的列/条目进行“排序”chorder.

chorder依次调用C函数Ccountingcharacter.c。现在,我认为问题是由于“区域设置”造成的。

让我们看看我的 Mac 上的“区域设置”是什么。

Sys.getLocale()
# [1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8"

现在让我们看看如何order对其进行排序:

x <- c("USA", "Ubuntu", "Uzbekistan")
order(x)
# [1] 2 1 3

现在,让我们将“区域设置”更改为“C”。

Sys.setlocale("LC_ALL", "C")
# [1] "C/C/C/C/C/en_US.UTF-8"

order(x)
# [1] 1 2 3

From ?order:

字符向量的排序顺序将取决于所使用的语言环境的整理顺序:请参阅Comparison.

From ?Comparison:

字符向量中的字符串比较是使用所使用的语言环境的整理顺序在字符串中按字典顺序进行的:请参阅语言环境。 en_US 等语言环境的整理顺序通常与 C(应使用 ASCII)不同,并且可能会令人惊讶。请注意不要对排序顺序做出任何假设:例如在爱沙尼亚语中,Z 位于 S 和 T 之间,并且排序规则不一定是逐个字符的 - 在丹麦语中,aa 排序为单个字母,位于 z 之后......

所以,基本上,order以及在“C”语言环境下,给出的顺序与data.table's setkey。我的猜测是 C 函数调用chorder自动在 C 语言环境上运行,它将比较“S”在“b”之前的 ascii 值。

让 @MatthewDowle 注意到这一点可能很重要(如果他还没有意识到)。所以,我建议您将此作为错误归档here(只是要确定)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

data.table 设置 key 时如何对字符串进行排序 的相关文章

  • 如何让 print() 将参数传递给 R 中用户定义的打印方法?

    我在 R 中定义了一个 S3 类 它需要自己的打印方法 当我创建这些对象的列表并打印它时 R 按其应有的方式对列表中的每个元素使用我的打印方法 我想对打印方法实际显示的数量进行一些控制 因此 我的类的 print 方法需要一些额外的参数 但
  • par(mfrow=c(1,2)) 不显示并排密度图[重复]

    这个问题在这里已经有答案了 par mfrow c 1 2 plot 1 12 log y plot 1 2 xaxs i 然而 当我尝试做并排密度图时 图会单独输出 load the stud recs dataset library U
  • R 根据事件更新值

    我最近发布了这个问题 该问题已经与我在笔记本电脑上本地使用的 Mysql 数据库相关 由于我在 Mysql 中没有找到问题的解决方案 其他人似乎也没有找到解决方案 所以我想再次发布它 但现在与 R 相关 我使用带有 RMysql 包的数据库
  • 如何在R中计算文本中的句子数?

    我使用 R 将文本读入readChar 功能 我的目的是测试文本句子中字母 a 出现次数与字母 b 出现次数一样多的假设 我最近发现了 stringr 包 它帮助我对文本做很多有用的事情 例如计算字符数以及整个文本中每个字母出现的总数 现在
  • .wav 文件长度/持续时间,无需读入文件

    有没有办法提取有关 wav 文件长度 持续时间的信息 而无需在 R 中读取文件 我有数千个这样的文件 如果我必须阅读每个文件才能找到其持续时间 那将需要很长时间 Windows 文件资源管理器为您提供了打开 长度 字段的选项 并且您可以查看
  • kableExtra 中的 row_spec() 函数不会在 html 输出中创建水平线

    我想在 kableextra 表中的某一行下方添加一条水平线 row spec 函数的参数 hline after 应该在行下方添加水平线 row spec 文档 https www rdocumentation org packages
  • 删除ggplot2中的负图区域[重复]

    这个问题在这里已经有答案了 如何删除 ggplot2 中 x 轴和 y 轴下方的绘图区域 请参见下面的示例 我尝试了几个主题元素 panel border panel margin plot margin 但没有任何运气 p lt ggpl
  • 在shiny中过滤传单地图数据

    我在用传单地图设置这个闪亮的东西时遇到了麻烦 我的原帖 https stackoverflow com questions 50111566 applying leaflet map bounds to filter data within
  • 如何删除箱线图上的刻度线

    我试图从箱线图中删除 x 轴刻度线 但保留与刻度线关联的标签 这在基础 R 中可能吗 colors lt c lightskyblue3 gray78 gold1 wheat1 boxplot avgscore module data mi
  • 纵向序列数据的三次样条方法?

    我有一个串行数据 格式如下 time milk Animal ID 30 25 6 1 31 27 2 1 32 24 4 1 33 17 4 1 34 33 6 1 35 25 4 1 33 29 4 2 34 25 4 2 35 24
  • 选择 R 中的数据表中隐藏时(在绿色加号下方)列的显示顺序

    Context 使用 DataTables 库制作交互式表格时 当屏幕宽度对于列的数量和宽度来说太窄时 列将隐藏在绿色 号下 我有一个非常宽的表格 有 20 多列 其中一些内容非常冗长 因此某些列在所有屏幕宽度下总是隐藏的 每次隐藏新列时
  • R 中的快速 QR 分解

    我有大量矩阵 需要对其执行 QR 分解并存储生成的 Q 矩阵 进行归一化 以便 R 矩阵在其对角线上具有正数 除了使用之外还有其他方法吗qr 功能 这是工作示例 system time Parameters for the matrix t
  • Dendextend:关于如何根据定义的组为树状图的标签着色

    我正在尝试使用一个名为 dendextend 的很棒的 R 包来绘制树状图并根据一组先前定义的组为其分支和标签着色 我已阅读您在 Stack Overflow 中的答案以及 dendextend vignette 的常见问题解答 但我仍然不
  • 在 R 中绘制 Likert 变量的堆积条形图

    假设我有一个如下所示的数据框 P Q1 Q2 1 1 4 1 2 2 3 4 3 1 1 4 其中的列告诉我哪个人相应地回答了问题 q1 q2 中的哪一个 这些问题需要按照 4 分李克特量表进行回答 例如 批准 表示 1 稍微批准 表示 2
  • API 请求和curl::curl_fetch_memory(url, handle = handle) 中的错误:SSL 证书问题:证书已过期

    几天前 我运行了代码几个月 没有任何问题 GET url myurl query 今天我遇到一个错误 Error in curl curl fetch memory url handle handle SSL certificate pro
  • ggplot2 geom_密度和geom_histogram在一个图中

    如何制作一个所有条形加起来为 1 的直方图 并在适合的上方添加一个密度层 set seed 1234 df lt data frame sex factor rep c F M each 200 weight round c rnorm 2
  • 朴素贝叶斯分类器仅基于先验概率做出决策

    我试图根据推文的情绪将推文分为三类 买入 持有 卖出 我正在使用 R 和包 e1071 我有两个数据框 一个训练集和一组需要预测情绪的新推文 训练集数据框 text sentiment this stock is a good buy Bu
  • 使用 Shiny 发布平行坐标图表时出现“错误:路径[1]="”:没有这样的文件或目录”

    我有一个似乎很常见但我还没有找到解决方案的问题 当尝试使用 rCharts Parcoords 发布 Web 应用程序时 出现以下错误 错误 路径 1 没有这样的文件或目录 奇怪的是 该应用程序在我的笔记本电脑上运行得很好 下面是我正在使用
  • 更改闪亮 R 中的默认浏览器

    我在 RStudio 中使用 01 hello 虽然在 IE 中默认打开程序时它不会显示直方图 但即使在 Chrome 中 滑块也不起作用 我无法滑动条形图并看到直方图中的变化 如何更改 R 中的默认浏览器 以便闪亮启动 Chrome 而不
  • 旋转 Markdown 的表格 pdf 输出

    我想将 pdf 上的表格输出旋转 90 度 我正在使用 Markdown 生成报告并kable循环显示表格 如果可以的话我想继续使用kable因为还有很多其他依赖于它的东西我没有包含在这个 MWE 中 这是一个简单的例子 使用iris数据集

随机推荐