Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用长字符串按列对R数据帧进行排序_R_Sorting - Fatal编程技术网

使用长字符串按列对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

如何按由长字符串组成的列对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
  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>