R:按字母数字列对数据框中的所有列进行排序
R: Sorting all columns in data frame by an alphanumeric column
我想按包含字母数字数据的列对 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
: 未执行排序
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
这里有一个选项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
我找到了一个解决方案,该解决方案对所提供的示例以及我的真实数据始终有效。感谢@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
我想按包含字母数字数据的列对 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
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
这里有一个选项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
我找到了一个解决方案,该解决方案对所提供的示例以及我的真实数据始终有效。感谢@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