如何最好在 R 中将 file2 中的行匹配和排序到 file1

How do I match and sort rows in file2 to file1 preferably in R

我有两个文件。每个文件包含一定数量的行和列。每个文件的第二列包含一个唯一的 GENE ID,这两个文件在两个文件中都是相同的(它们只是在不同的行中)。例如

文件 1 的第 3 行(第二列)可能有基因 "LINC00273",文件 2 的第 4002 行(第二列)可能有 "LINC00273"。

我想做的是对文件 2 进行排序,如果文件 1 第 1 行的第一个 GENE 是 "VAGAB" 那么文件 2 第 1 行的第一个 GENE 是 "VAGAB" 整行完好无损(该行包含覆盖信息,因此我需要相应地移动数字)。

例:文件1[#]对应行号

[1] GENE100X VAGAB VAGAB 1.0 1.0 1.0 5.0 11198.0 
...
[5000] GENE900X ZZZZ ZZZZ 1.0 0 4.2 1.0 78.0

文件 2

[1] GENE44X AAAA AAAA 1.0 1.0 1.0 1.0 1.0
...
[5000] GENE106X VAGAB VAGAB 5.0 5.0 5.0 1.0 55.0

文件 2 的预期输出为:

[1] GENE106X VAGAB VAGAB 5.0 5.0 5.0 1.0 55.0
...
[5000] GENE300X ZZZZ ZZZZ 88.0 88.0 1.0 1.0 1.0

所有文件均以制表符分隔。示例中的所有数字(行号和列号)都是虚构的。唯一不变的列是第 2 列和第 3 列,它们在两个文件中都是相同的,所以我想使用它们进行排序。

如果可以的话,我不想创建第三个文件。我只是希望文件 2 中的行与文件 1 中的行相同,方法是通过在两个文件的第 2 列中找到的 "Gene" 名称来匹配它们。

首选 R 解决方案,因为这是我目前正在学习的内容,但我会采用任何语言的任何解决方案,然后我可以将其用作模板,以在以后练习时提出我自己的 R 解决方案。

将两个文件加载到数据框中(下面使用的示例数据)。

file1 <- data.frame(id=1:3,name=letters[c(3,1,2)])
file2 <- file1[c(2,3,1),]

然后你可以定义一个排序顺序:

file1$name <- factor(file1$name, levels = file1$name)
file2$name <- factor(file2$name, levels = file1$name)

然后对file2进行排序:

file2 <- file2[with(file2, order(name)) , ]

让我们先设置一些示例数据:

file1 <- data.frame(id=1:3,name=letters[c(3,1,2)])
#  id name
#1  1    c
#2  2    a
#3  3    b

file2 <- file1[c(2,3,1),]
file2$id <- paste("two",file2$id,sep="")
#    id name
#2 two2    a
#3 two3    b
#1 two1    c

然后使用 match:

匹配行
file2[match(file1$name,file2$name),]
#    id name
#1 two1    c
#2 two2    a
#3 two3    b

这基本上与将所有 file2 数据与 file1 数据的匹配行合并相同。

merge(file1["name"], file2, by="name", sort=FALSE)
#  name   id
#1    c two1
#2    a two2
#3    b two3