提问人:user1631306 提问时间:10/10/2012 最后编辑:Jaapuser1631306 更新时间:8/1/2019 访问量:4142
如何按字典顺序订购我的数据帧
How to order my dataframe lexicographicaly
问:
我有一个以下数据框
a = data.frame(a=c(1,2,3,4,5,6,7),b=c(1,2,3,10,12,21,4),c=c(1,2,10,11,"X","Y",3))
> a
a b c
1 1 1 1
2 2 2 2
3 3 3 10
4 4 10 11
5 5 12 X
6 6 21 Y
7 7 4 3
我想按字典顺序对整个数据帧进行排序,以便输出(例如,“c”列)应如下所示
> a[,"c"]
[1] 1 2 3 10 11 X Y
我试过了,我得到了不同的答案
indata <- a[do.call(order,a[,c("c","a","b")]),]
> indata[,"c"]
[1] 1 10 11 2 3 X Y
Levels: 1 10 11 2 3 X Y
我尝试了 gtools、mixedorder 包并在一列上运行良好:
> a[mixedorder(a$c),]
a b c
1 1 1 1
2 2 2 2
3 3 3 10
4 4 10 11
5 5 12 X
6 6 21 Y
7 7 4 3
但是如果我包含多个列,它就不起作用:
> a[with(a,order(mixedorder(c),mixedorder(b),mixedorder(a))),]
a b c
1 1 1 1
2 2 2 2
4 4 10 11
5 5 12 X
6 6 21 Y
7 7 4 3
3 3 3 10
虽然我期待:
a b c
1 1 1 1
2 2 2 2
4 7 4 3
5 3 3 10
6 4 10 11
7 5 12 X
3 6 21 Y
答:
7赞
Josh O'Brien
10/10/2012
#1
一种选择是从 gtools 包中使用。mixedorder()
library(gtools)
a[mixedorder(a$c),]
# a b c
# 1 1 1 1
# 2 2 2 2
# 7 7 4 3
# 3 3 3 10
# 4 4 10 11
# 5 5 12 X
# 6 6 21 Y
评论
1赞
user1631306
10/10/2012
如何同时使用多个列进行排序(首先是 c,然后是 b,然后是 a)?
1赞
joran
10/10/2012
@user1631306 在 plyr 包中尝试。arrange
2赞
Josh O'Brien
10/10/2012
@user1631306 -- 在这种情况下,您可以这样做: .a[with(a, order(mixedorder(c), b, a)),]
4赞
Tyler Rinker
10/10/2012
#2
坚持基础,你可以自己做一个函数:
a = data.frame(a=c(1,2,3,4,5,6,7),b=c(1,2,3,10,12,21,4),c=c(1,2,10,11,"X","Y",3))
SORTER_DEVICE <- function(x) {
c(sort(as.numeric(na.omit(gsub("[a-zA-Z]", NA, x)))),
sort(na.omit(gsub("[0-9]", NA, x))))
}
data.frame(apply(a, 2, SORTER_DEVICE))
1赞
gkcn
8/14/2013
#3
不幸的是,mixedsort (还)不支持多列排序。因此,您需要自己实现它,例如:
a[order(sub("[0-9]+", "", a$c),
as.numeric(sub("[[:alpha:]]*([[:digit:]]*)", '\\1', a$c)),
as.numeric(a$b),
as.numeric(a$a)), ]
首先,使用 a$c 按字母数字对 data.frame 进行排序,对于平局情况(实际上在您的 data.frame 'a' 中不存在),它使用 a$b 和 a$a。
输出为:
a b c
1 1 1 1
2 2 2 2
7 7 4 3
3 3 3 10
4 4 10 11
5 5 12 X
6 6 21 Y
PS:这是大卫·温塞米乌斯(David Winsemius)在这篇文章中写的,作为对类似问题的回答。
1赞
zx8754
8/1/2019
#4
假设这些是人类染色体名称,chr1...chr22、chrX、chrY。我们可以将它们转换为数字,然后使用顺序:
# convert to numeric
a$chromN <- as.integer(ifelse(a$c == "X", "23", ifelse(a$c == "Y", "24", a$c)))
# now sort as usual:
a[ order(a$chromN), ]
# a b c chromN
# 1 1 1 1 1
# 3 3 3 10 2
# 4 4 10 11 3
# 2 2 2 2 4
# 7 7 4 3 5
# 5 5 12 X 23
# 6 6 21 Y 24
评论
c
c