如何在R中对数据进行排序

时间:2015-03-04 20:36:22

标签: r

所以我想说我的数据来自excel电子表格,如:

S96-A44 | Meox1
S96-A45 | Irx3
S96-A42 | Pax6 
S94-A01 | Puit
S91-A33 | Itf4
S95-A56 | Lit5

我想对它们进行分类,样品会下降并且检测结果会上升:

S96-A42 | Pax6 
S96-A44 | Meox1
S96-A45 | Irx3
S95-A56 | Lit5
S94-A01 | Puit
S91-A33 | Itf4

最好的方法是什么?我知道这个问题有点模糊,如果你需要我澄清一下我可以,谢谢。

2 个答案:

答案 0 :(得分:3)

这是一个可能的组合tidyrdata.table解决方案。您似乎希望按单列的两个部分对数据进行排序,然后按两个不同的顺序对数据进行排序。这里我们首先将第一列分成两列,然后重新排序数据。 (我假设您的数据名为df,列数为V1V2

library(tidyr)
library(data.table)
setorder(separate(setDT(df), V1, c("sample", "assay")), -sample, assay)[]
#    sample assay    V2
# 1:    S96   A42  Pax6
# 2:    S96   A44 Meox1
# 3:    S96   A45  Irx3
# 4:    S95   A56  Lit5
# 5:    S94   A01  Puit
# 6:    S91   A33  Itf4

答案 1 :(得分:1)

使用data.table版本1.9.5+,您可以使用函数tstrsplit(),它与基函数strsplit()非常相似,不同之处在于它转换了从{strsplit()返回的列表。 1}}。

这有助于直接在data.table中分配列,如下所示:

require(data.table) ## v1.9.5
setDT(df)[, c("sample", "assay") := tstrsplit(V1, "-", fixed=TRUE)]
setorder(df, -sample, assay)
df[, V1 := NULL] # removes V1

setDTdf转换为data.table。 :=函数会将获得的两列添加到df,并将其命名为sampleassay

然后我们重新排序列的sample逐渐减少,然后按assay递增。

您可以从here安装开发版1.9.5