所以我想说我的数据来自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
最好的方法是什么?我知道这个问题有点模糊,如果你需要我澄清一下我可以,谢谢。
答案 0 :(得分:3)
这是一个可能的组合tidyr
和data.table
解决方案。您似乎希望按单列的两个部分对数据进行排序,然后按两个不同的顺序对数据进行排序。这里我们首先将第一列分成两列,然后重新排序数据。 (我假设您的数据名为df
,列数为V1
和V2
)
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
setDT
将df
转换为data.table。 :=
函数会将获得的两列添加到df
,并将其命名为sample
和assay
。
然后我们重新排序列的sample
逐渐减少,然后按assay
递增。
您可以从here安装开发版1.9.5
。