为什么从 3.5.2 升级到 4.0.0 后,R 的排序会改变使用 load() 导入的数据?

2023-11-27

简洁版本。我load()数据包中的数据。以前,包中的测试通过了,现在失败了,因为输出sort改变了。 这是一个最小的可重现示例 - 详细信息请参见下文:

y <- c("Schaffhausen", "Schwyz", "Seespital", "SRZ")
sort(y)
# OLD 3.5.2 [1] "Schaffhausen" "Schwyz"       "Seespital"    "SRZ"        
# NEW 4.0.0 [1] "SRZ"          "Schaffhausen" "Schwyz"       "Seespital" 
# Update 4.0.2 see comment:
# [1] "Schaffhausen" "Schwyz"       "Seespital"    "SRZ"     

# From jay.sf's comment
sort.int(y, method="radix")
# [1] "SRZ"          "Schaffhausen" "Schwyz"       "Seespital"  
sort.int(y, method="shell")
# [1] "Schaffhausen" "Schwyz"       "Seespital"    "SRZ"  

# From Henrik's comment:
data.table::fsort(y)
# [1] "SRZ"          "Schaffhausen" "Schwyz"       "Seespital"  

我发现的唯一相关的报告变化是

R 4.0.0 中的变化
新功能
...
通过 read.table() 加载数据集时,data() 现在使用 LC_COLLATE=C 来确保可能的字符串到因子转换的结果与区域设置无关。

但我什至不确定这是否可以解释我所看到的。 由于我想最大程度地减少导入包的数量,并且我想了解发生了什么,所以我不确定如何继续。我错过了什么吗? (更改为sort.int用方法radix会完成这项工作,但仍然:为什么会改变?这样真的更好吗?

我刚刚意识到(感谢罗兰)sort以我为例sort.int:

function (x, decreasing = FALSE, na.last = NA, ...) 
{
  if (is.object(x)) 
    x[order(x, na.last = na.last, decreasing = decreasing)]
  else sort.int(x, na.last = na.last, decreasing = decreasing, 
    ...)
}

From ?sort.int:

“auto”方法为短(小于2^31个元素)数值向量、整数向量、逻辑向量和因子选择“radix”;否则,“外壳”。)

根据文档,sort.int从 4.0.0 到 4.0.2 没有改变。

From ?data.table::setorder

data.table 始终以“C-locale”重新排序。结果, 排序可能与通过 base::order 获得的排序不同。用英语 语言环境,例如,在 C 语言环境中排序区分大小写。因此, 排序 c("c", "a", "B") 在 data.table 中返回 c("B", "a", "c") 但 c("a", "B", "c") 按基本::顺序。请注意,这在大多数情况下没有区别 数据案例;两者都在 ids 上返回相同的结果,其中仅 存在大写或小写字母(“AB123”

使用 C-locale 使 data.table 中的排序行为更加有效 跨会话和区域设置保持一致。 base::order 的行为 取决于有关 R 会话区域设置的假设。用英语 locales, "america"

(相关问题使用 R 进行语言相关排序 and 最佳实践:我应该尝试将语言环境更改为 UTF-8 还是保持原样安全?)


Details

R.version # old              _                           
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          3                           
minor          5.2                         
year           2018                        
month          12                          
day            20                          
svn rev        75870                       
language       R                           
version.string R version 3.5.2 (2018-12-20)
nickname       Eggshell Igloo 

y <- c("Schaffhausen", "Schwyz", "Seespital", "SRZ")
sort(y)
# [1] "Schaffhausen" "Schwyz"       "Seespital"    "SRZ"         

stringr::str_sort(y)
# [1] "Schaffhausen" "Schwyz"       "Seespital"    "SRZ"         

stringr::str_sort(y, locale = "C")
# [1] "SRZ"          "Schaffhausen" "Schwyz"       "Seespital"   

# =======
R.version # new after upgrade
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          4                           
minor          0.0                         
year           2020                        
month          04                          
day            24                          
svn rev        78286                       
language       R                           
version.string R version 4.0.0 (2020-04-24)
nickname       Arbor Day

y <- c("Schaffhausen", "Schwyz", "Seespital", "SRZ")
sort(y)
# [1] "SRZ"          "Schaffhausen" "Schwyz"       "Seespital"   

stringr::str_sort(y)
# [1] "Schaffhausen" "Schwyz"       "Seespital"    "SRZ"         

stringr::str_sort(y, locale = "C")
#[1] "SRZ"          "Schaffhausen" "Schwyz"       "Seespital"  

# ==== Test with new 4.0.2
R.version
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          4                           
minor          0.2                         
year           2020                        
month          06                          
day            22                          
svn rev        78730                       
language       R                           
version.string R version 4.0.2 (2020-06-22)
nickname       Taking Off Again 

y <- c("Schaffhausen", "Schwyz", "Seespital", "SRZ")
sort(y)
# [1] "Schaffhausen" "Schwyz"       "Seespital"    "SRZ"         

stringr::str_sort(y)
# [1] "Schaffhausen" "Schwyz"       "Seespital"    "SRZ"         

stringr::str_sort(y, locale = "C")
# [1] "SRZ"          "Schaffhausen" "Schwyz"       "Seespital" 

总之,这是一个错误,已在 R 版本 4.0.1 中删除。正如@Roland 所想的那样。
From CRAN:

在 R 4.0.0 中,sort.list(x) when is.object(x)是真的,例如,对于x <-I(letters),不小心usingmethod = "radix"。最后, 例如。,merge(<data.frame>)比以前慢得多;报道于 PR#17794。

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

为什么从 3.5.2 升级到 4.0.0 后,R 的排序会改变使用 load() 导入的数据? 的相关文章

  • 在 dfm 中查找非英语标记并将其删除

    在 dfm 中如何检测非英语单词并将其删除 dftest lt data frame id 1 3 text c Holla this is a spanish word English online here Bonjour commen
  • 如何按组计算日期之间的时间差

    我有一个包含日期 时间和位置的数据框 我想计算组内记录与上一条记录 根据日期排列 之间的分钟差异 并变异为新列 我已经弄清楚如何使用循环来完成此操作 但这仅适用于所有组 位置 而且我不确定如何按组执行此操作 fake data set fo
  • 如何在R中用采样字符替换通配符

    我有以下顺序 s0 lt KDRH THLA RT HLAK 那里的通配符字符由 我想要做的是用该向量中的采样字符替换该字符 AADict lt c A R N D C E Q G H I L K M F P S T W Y V Since
  • 从 R 中的 glm 中提取系数

    我进行了逻辑回归 结果如下 ssi logit single age coefficients coefficients Intercept age 3 425062382 0 009916508 我需要选取系数age 目前我使用以下代码
  • 将鼠标悬停在 ggplot 上时更新 CSS 和渲染工具提示以错误的顺序发生

    我在这里构建了一个虚拟应用程序 它为 ggplot 生成悬停消息 并确保它们保持在屏幕边界内 我编写了一些计算来确定所需的 CSS 更正并将其发送到服务器 它基于将悬停消息保留在此处的第一次尝试 SO问题 https stackoverfl
  • strsplit 与 gregexpr 不一致

    一条评论 https stackoverflow com questions 23961022 split strings on first and last commas 23964843 noredirect 1 comment3692
  • 使用 dplyr::filter 创建 R 函数问题

    我查看了其他答案 但找不到使下面的代码起作用的解决方案 基本上 我正在创建一个函数inner join两个数据框和filter基于函数中输入的列 问题是filter部分功能不起作用 但是 如果我将过滤器从函数中取出并附加它 它就会起作用my
  • 按组划分的模态值(最常见)的简明 R data.table 语法

    用于查找每个 id 最常见类别的高效且优雅的 data table 语法是什么 我保留一个指示 NA 位置的布尔向量 用于其他目的 dt data table id rep 1 2 7 category c x y NA print dt
  • 当 R 中出现“warnings()”时中断循环

    我有一个问题 我正在运行一个循环来处理多个文件 我的矩阵非常巨大 因此如果我不小心 我经常会耗尽内存 如果创建任何警告 是否有办法打破循环 它只是继续运行循环并报告它在很久以后失败 烦人 聪明的 stackoverflow ers 有什么想
  • 使用 Groovy 对 XML 文件进行排序

    有没有办法可以使用 Groovy 根据某些属性对 xml 文件进行排序 这是我的 xml
  • R 绘制一些 unicode 字符,但不绘制其他字符

    我们的系统管理员刚刚将我们的操作系统升级到 SLES12SP1 我重新安装了 Rv3 2 3 并尝试绘图 我用cairo pdf并尝试绘制 x 标签为的图 u0298即太阳能符号 但它不起作用 标签只是空白 例如 cairo pdf Rpl
  • R 中的离散化

    有谁知道有一个包可以实现连续变量离散化的监督学习算法 dprep 包包含类似的功能 但该包已被弃用 有任何想法吗 感谢您的帮助 您仍然可以使用dprep包 但你必须从源代码安装它 我刚刚测试过 它运行良好 不过 您或许可以看看离散化 htt
  • R ggplot结合颜色图例和不同因子长度的填充

    我正在使用不完整因子设计的数据绘制图表 由于设计的原因 我的颜色手动比例和填充手动比例的长度不同 因此 我得到了两个传说 我怎样才能删除其中之一或者更好地将它们组合起来 我看过这些问题 合并单独的大小并填充 ggplot 中的图例 http
  • 从谷歌街道地址中提取城市和州信息

    我有一个数据集 其中包含不同点位置的纬度 经度信息 我想知道与每个点关联的城市和州 按照此example https stackoverflow com questions 22911642 applying revgeocode to a
  • 按组渐进串联列[重复]

    这个问题在这里已经有答案了 假设我有这个输入 ID date 1 date 2 str 1 1 2010 07 04 2008 01 20 A 2 2 2015 07 01 2011 08 31 C 3 3 2015 03 06 2013
  • 对于 X 中的每个元素,找到最大的索引,而不会超出 Y 中的范围

    我正在寻找一种方法来提高以下算法的性能 给定两个数组 X 和 Y 对于 X 的每个元素 找到 Y 中不超过 X 中元素值的最大值的索引 可以安全地假设 X 和 Y 是单调递增 已排序 并且 Y 1 小于每个X 中的值 而且 X 通常比 Y
  • 通过环境.yml 文件使用 conda 安装 R 包

    通常我会创建 conda 环境 例如 conda env create f environment yml conda activate env name 通常我使用 Python 工作 典型的environment yml简单的文件可能看
  • 合并结果的行数多于一个数据框

    我有两个数据框 第一个包含 9994 行 第二个包含 60431 行 我想合并两个数据框 以便合并后的数据框包含两个数据框的组合列 但只包含 9994 行 但是 合并后我得到了超过 9994 行 我怎样才能确保这种情况不会发生 df1 re
  • 在 ggplot2 中隐藏单个几何图例

    我将相同的变量 颜色 映射到两个不同几何图形中的颜色 我希望它们要么出现在单独的图例中 DHJ 和 EFI 要么最好完全跳过第二个图例 对于 E F 和 I 目前 R 将两者混合在一起 并给我一个图例 其中按字母顺序列出了 DEFHIJ 所
  • 根据值绘制具有条件颜色的折线图

    我想绘制折线图 根据值 它应该改变它的颜色 我发现的是 plot sin seq from 1 to 10 by 0 1 type p col ifelse sin seq from 1 to 10 by 0 1 gt 0 5 red ye

随机推荐