「PK」字符串中的数值咋排序(差点以为自己赢了)
今天是生信星球陪你的第496天
大神一句话,菜鸟跑半年。我不是大神,但我可以缩短你走弯路的半年~
就像歌儿唱的那样,如果你不知道该往哪儿走,就留在这学点生信好不好~
这里有豆豆和花花的学习历程,从新手到进阶,生信路上有你有我!
豆豆和花花写于19.11.30
随着豆豆和花花涉足的领域越来越不同,我们擅长的知识也都不一样了。于是经常互补一下,讨论不一样的方法。今天又来了~以前的PK看下面:
批量重命名:linux不会,不如用R吧
批量重命名:如果会linux呢?
豆豆和花花用代码P了个K
问题描述
简单来说就是类似于怎么解决字符串里面chr10排在chr2前面的问题,是豆豆实战踩到的坑。
原始表达矩阵是这样的:
这是hisat+featureCounts出来的表达矩阵

把这个数据读到R中
expr_df <- read.table(file='geneid_counts.txt',row.names = 1,
header = TRUE, stringsAsFactors = FALSE,
check.names = F)
然后去掉没用的信息
expr_df <- expr_df[,-c(1:5)]
> expr_df[1:3,1:6]
12-0-1 12-0-2 12-10-1 12-10-2 12-2-1 12-2-2
ENSMUSG00000102693.1 0 0 0 0 0 0
ENSMUSG00000064842.1 0 0 0 0 0 0
ENSMUSG00000051951.5 0 1 1 3 11 7
其实目前的这个数据是有问题的
仔细看它的列名,以12-0-1
为例:第一个数字12表示一组处理(第二个叫34);第二个数字0、2、6、10表示处理后的天数;最后一个数字1和2表示两个重复
其实正常的分组信息应该是:
第一个处理的0、2、6、10天(每天各两个重复)
“12-0-1”
“12-0-2”
“12-2-1”
“12-2-2”
“12-6-1”
“12-6-2”
“12-10-1”
“12-10-2”
第二个处理的0、2、6、10天(每天各两个重复)
“34-0-1”
“34-0-2”
“34-2-1”
“34-2-2”
“34-6-1”
“34-6-2”
“34-10-1”
“34-10-2”
但是,上游出来的数据将我们的分组给篡改了
在12-0-x
后出现了12-10-x
,而不是12-2-x
,这是因为计算机的ascii编码,0后面是1,1后面是2,因此它不会管是1还是10还是100,都会显示在0之后和2之前
看花花之前发的这篇:ggplot2的x轴坐标顺序不对肿么办 也是说明了这个问题
如果想把原始的表达矩阵样本顺序变成数值排序的样子,应该怎么办?
下面开始表演
豆豆的解答-Linux
原来的列名
> colnames(expr_df)
[1] "12-0-1" "12-0-2" "12-10-1" "12-10-2" "12-2-1" "12-2-2" "12-6-1"
[8] "12-6-2" "34-0-1" "34-0-2" "34-10-1" "34-10-2" "34-2-1" "34-2-2"
[15] "34-6-1" "34-6-2"
做的简单更改
关于linux的sort:https://www.jianshu.com/p/58dad11116ce
# 先把原来的列名输出
write.table(colnames(expr_df),file = "need_order_colnames.txt",
row.names = F,col.names = F)
# 使用sort命令
cat need_order_colnames.txt | sort -V >reorder_colnames.txt
# 按数值排序后再重新读入
new_col_names <- read.table("reorder_colnames.txt")
> head(new_col_names)
V1
1 12-0-1
2 12-0-2
3 12-2-1
4 12-2-2
5 12-6-1
6 12-6-2

然鹅,帅不过三秒,被花花秒杀【不过被秒得很开心~】
花花的解答-R
事情很简单,R语言里面,排序的方式很多啊:
[向量排序:match,rank,order,sort,rev](https://mp.weixin.qq.com/s/Y3qcYt3GcxeFFGvSqz42vw
)
我觉得sort会有对应的参数,可是没找到。
犹豫了一下,想起了stringr了!想着里面应该有排序的函数和参数吧!

剩下的事情就很简单了, 直接看函数和参数的字面意思,就半试半猜做出来咯。
x = read.table("need_order_colnames.txt",
stringsAsFactors = F)$V1
x
# [1] "12-0-1" "12-0-2" "12-10-1" "12-10-2" "12-2-1"
# [6] "12-2-2" "12-6-1" "12-6-2" "34-0-1" "34-0-2"
# [11] "34-10-1" "34-10-2" "34-2-1" "34-2-2" "34-6-1"
# [16] "34-6-2"
library(stringr)
str_sort(x,numeric = T)
# [1] "12-0-1" "12-0-2" "12-2-1" "12-2-2" "12-6-1"
# [6] "12-6-2" "12-10-1" "12-10-2" "34-0-1" "34-0-2"
# [11] "34-2-1" "34-2-2" "34-6-1" "34-6-2" "34-10-1"
# [16] "34-10-2"
linux做出来还得导出文件吧,作图还得再读取吧?瞅瞅你整的这个麻烦。
有问题找老哈!一个顶俩~
插个小广告!
再给生信技能树打个call!
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!