如何最好在 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
我有两个文件。每个文件包含一定数量的行和列。每个文件的第二列包含一个唯一的 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