使用长字符串按列对R数据帧进行排序
如何按由长字符串组成的列对R数据进行排序?下面的例子说明了我的问题:使用长字符串按列对R数据帧进行排序,r,sorting,R,Sorting,如何按由长字符串组成的列对R数据进行排序?下面的例子说明了我的问题: > a = matrix(NA, nrow=4, ncol=3) > a[,1] = c(1,2,3,4) > a[,2] = c("gene001_10M","gene002_10M","gene001_50M","gene002_50M") > colnames(a) = c("value","sortkey","other") > a = as.data.frame(a) > a
> a = matrix(NA, nrow=4, ncol=3)
> a[,1] = c(1,2,3,4)
> a[,2] = c("gene001_10M","gene002_10M","gene001_50M","gene002_50M")
> colnames(a) = c("value","sortkey","other")
> a = as.data.frame(a)
> a
value sortkey other
1 1 gene001_10M <NA>
2 2 gene002_10M <NA>
3 3 gene001_50M <NA>
4 4 gene002_50M <NA>
>a=矩阵(NA,nrow=4,ncol=3)
>a[,1]=c(1,2,3,4)
>a[,2]=c(“gene001_10M”、“gene002_10M”、“gene001_50M”、“gene002_50M”)
>colnames(a)=c(“值”、“排序键”、“其他”)
>a=as.data.frame(a)
>a
值排序键其他
1 1千米
2.2×10米
3.3.0米
4.5米
当我现在按“a”排序时,排序键似乎是从右向左读取的,而“a”保持不变:
> b = a[sort(a$sortkey),]
> b
value sortkey other
1 1 gene001_10M <NA>
2 2 gene002_10M <NA>
3 3 gene001_50M <NA>
4 4 gene002_50M <NA>
>b=a[sort(a$sortkey),]
>b
值排序键其他
1 1千米
2.2×10米
3.3.0米
4.5米
然而,我的目标是:
> b
value sortkey other
1 1 gene001_10M <NA>
3 3 gene001_50M <NA>
2 2 gene002_10M <NA>
4 4 gene002_50M <NA>
>b
值排序键其他
1 1千米
3.3.0米
2.2×10米
4.5米
当您有数字
、字母表
等时,最好使用gtools
中的mixedorder
,尽管在这里它单独使用顺序
a[order(as.character(a$sortkey)),]
# value sortkey other
#1 1 gene001_10M <NA>
#3 3 gene001_50M <NA>
#2 2 gene002_10M <NA>
#4 4 gene002_50M <NA>
否则,您必须指定index.return=TRUE
,这在sort
中默认为FALSE
sort(as.character(a$sortkey), index.return=TRUE)
#$x
#[1] "gene001_10M" "gene001_50M" "gene002_10M" "gene002_50M"
#$ix
#[1] 1 3 2 4
然后,使用
a[sort(as.character(a$sortkey), index.return=TRUE)$ix,]
# value sortkey other
#1 1 gene001_10M <NA>
#3 3 gene001_50M <NA>
#2 2 gene002_10M <NA>
#4 4 gene002_50M <NA>
您还可以使用
order
和gsub
正则表达式预先删除字母
a[order(gsub("[a-zA-Z]+", "", a$sortkey)),]
# value sortkey other
# 1 1 gene001_10M <NA>
# 3 3 gene001_50M <NA>
# 2 2 gene002_10M <NA>
# 4 4 gene002_50M <NA>
a[订单(gsub(“[a-zA-Z]+”,“”,a$sortkey)),]
#值排序键其他
#1 1千米
#3.3.0米
#2.2×10米
#4.5米
太棒了!谢谢。我搜索了又搜索了一个解决方案,将数据框按两列排序——一列是字符串,另一列是日期。这给了我第一部分-然后我只是添加了日期栏。荣誉
library(gtools)
mixedorder(as.character(a$sortkey))
#[1] 1 3 2 4
a[order(gsub("[a-zA-Z]+", "", a$sortkey)),]
# value sortkey other
# 1 1 gene001_10M <NA>
# 3 3 gene001_50M <NA>
# 2 2 gene002_10M <NA>
# 4 4 gene002_50M <NA>