【问题标题】:R: Sorting all columns in data frame by an alphanumeric columnR:按字母数字列对数据框中的所有列进行排序
【发布时间】:2021-11-15 20:07:57
【问题描述】:

我想按包含字母数字数据的列对 R 中数据框的所有列进行排序。这是一个示例数据框:

R> dd <- data.frame(b = c("Hi", "Med", "Hi", "Low"),
                 x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
                 z = c("A1", "A3", "A10", "A2"))

1   Hi  A   8   A1
2   Med D   3   A3
3   Hi  A   9   A10
4   Low C   9   A2

我想对 z 列上的整个数据框进行排序。所需的输出如下所示 - 跨列的信息保持一致:

1   Hi  A   8   A1
2   Low C   9   A2
3   Med D   3   A3
4   Hi  A   9   A10

以下是迄今为止我尝试过但没有奏效的方法:

Method 1: "A10" 排序错误

R> dd<- dd[with(dd, order(z)), ]
R> View(dd)
1   Hi  A   8   A1
4   Hi  A   9   A10
2   Low C   9   A2
3   Med D   3   A3

Method 2: 未执行排序

R> library(gtools)
R> dd$z = factor(dd$z, levels = gtools::mixedsort(dd$z))
R> View(dd)
1   Hi  A   8   A1
2   Med D   3   A3
3   Hi  A   9   A10
4   Low C   9   A2

方法 3:不执行排序

R> library(stringr);
R> dd$z = factor(dd$z, levels = str_sort(dd$z, numeric=TRUE))
R> View(dd)
1   Hi  A   8   A1
2   Med D   3   A3
3   Hi  A   9   A10
4   Low C   9   A2

【问题讨论】:

  • dd[gtools::mixedorder(as.character(dd$z)), ]

标签: r sorting dataframe alphanumeric


【解决方案1】:

我找到了一个对提供的示例以及我的真实数据都有效的解决方案。感谢@rawr 的洞察力。当我创建或加载数据时,我必须将 stringAsFactors 设置为 false。

R> dd <- data.frame(b = c("Hi", "Med", "Hi", "Low"),
                 x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
                 z = c("A1", "A3", "A10", "A2"), stringsAsFactors = F)
R> dd

    b x y   z
1  Hi A 8  A1
2 Med D 3  A3
3  Hi A 9 A10
4 Low C 9  A2

R> library(gtools)
R> dd <- dd[gtools::mixedorder(dd$z), ]
R> dd

    b x y   z
1  Hi A 8  A1
4 Low C 9  A2
2 Med D 3  A3
3  Hi A 9 A10

【讨论】:

  • 我举了一个例子,说明不同的排序技术有偏差:df1 &lt;- data.frame(filename = rep("file.csv", 12), "baseline filename" = rep("baseline.csv", 12), y = c(1:12), z = c(rep("C4", 3), rep("C5", 3), rep("C10", 3), rep("C1", 3))) 如果使用 df1[gtools::mixedorder(df1$z), ] 并且 stringsAsFactors 设置为 false,则排序正确,但如果使用 df1 %&gt;% arrange(gtools::mixedorder(z)),则 C10 错误地放置在 C1 前面.这是一个意想不到的问题,所以我最初可能没有创建最好的例子。我的错!
  • 可能是bug
【解决方案2】:

这是mixedorder的选项

library(dplyr)
dd <- dd %>% 
         arrange(gtools::mixedorder(z))
dd
#   b x y   z
#1  Hi A 8  A1
#2 Low C 9  A2
#3 Med D 3  A3
#4  Hi A 9 A10

【讨论】:

  • 谢谢!这给出了我正在寻找的我发布的示例的输出。奇怪的是它没有正确排序我的实际数据文件,尽管它正在做某种排序。您是否知道有任何特殊情况可能导致此代码无法正确排序?
  • 我注意到在已经正确排序的数据帧上运行代码(或在未排序的数据帧上运行两次)会返回未排序的数据帧。我可以使用任何代码来始终识别正确的字母数字顺序吗?
  • 这很奇怪.. dd[gtools::mixedorder(dd$z), ] 给出的顺序与 dd %&gt;% arrange(gtools::mixedorder(z)) 不同,第二个是“正确的”,但前提是我们先将 dd$z 转换为字符。如果我们按因素排序,第一个是正确的。所以arrange 隐含地忽略了z 是一个因素并忽略了(表面上)期望的顺序?为什么要安排为我做这个决定?
  • @AlexW。如果没有显示问题的示例,很难对其发表评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 2013-05-01
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多