1

我想合并/合并两个文件,这样如果我的第一个文件的 B 列中的条目落入我的第二个文件中的 B 列和 C 列的范围内,则输出将包含两个文件中包含的所有信息。

像这样:

文件 1

     A      B
    rs10    23353
    rs100   10000
    rs234   54440

文件 2

    A        B      C
    E235    20000   30000
    E255    50000   60000

其中,因为 23353 介于 20000 和 30000 之间,而 54440 介于 50000 和 60000 之间,所以输出文件如下所示:

rs      23353   E235    20000   30000
rs234   54440   E255    50000   60000

并且 rs100 将被删除(从输出文件中),因为它不在文件 2 中任何行的范围内。

有什么建议么?

谢谢!

4

3 回答 3

1

像这样的东西应该可以解决问题。您可能可以使其更简洁,但为了阐明所有步骤,我将其变得过于明显。

NewMatrixCol1 <- c()
NewMatrixCol2 <- c()
NewMatrixCol3 <- c()
NewMatrixCol4 <- c()
NewMatrixCol5 <- c()

for (i in 1:length(file1$A)) {
    for (j in 1:length(file2$A)) {
        LowNumber <- file2$B[j]
        HighNumber <- file2$C[j]
        if (LowNumber <= file1$B[i] & file1$B[i]  <= HighNumber) {
            append(NewMatrixCol1, file1$A[i])
            append(NewMatrixCol2, file1$B[i])
            append(NewMatrixCol3, file2$A[j])
            append(NewMatrixCol4, file2$B[j])
            append(NewMatrixCol5, file2$C[j])
        } else {}
    }
}

dataframe <- data.frame(Col1 = NewMatrixCol1, Col2 = NewMatrixCol2, Col3 = NewMatrixCol3, Col4 = NewMatrixCol4, Col5 = NewMatrixCol5)

EDIT1:我误解了这个问题,现在正在研究它。

EDIT2:这个新的解决方案应该按指示工作。

EDIT3:)如 mfk534 所示,缺少 .

于 2012-08-07T18:24:25.797 回答
1

我看到您已经接受了答案,但这是另一种可能的解决方案。

这个功能只是被组合在一起,但可以进行更多工作以使其更通用。

myfun = function(DATA1, DATA2, MATCH1, MIN, MAX) {
  temp = sapply(1:nrow(DATA2), 
                function(x) DATA1[[MATCH1]] >= DATA2[[MIN]][x] &
                  DATA1[[MATCH1]] <= DATA2[[MAX]][x])
  if (isTRUE(any(rowSums(temp) == 0))) {
    temp1 = DATA1[-(which(rowSums(temp) == 0)), ]
  }
  OUT = cbind(temp1[order(temp1[[MATCH1]]), ], 
              DATA2[order(DATA2[[MIN]]), ], row.names=NULL)
  condition = ((OUT[4] <= OUT[2] & OUT[2] <= OUT[5]) == 0)
  if (isTRUE(any(condition))) {
    OUT[-which(condition), ]
  } else {
    OUT
  }
}

以下是该函数的作用:

  1. 它首先逐行比较 first 的第二列中的data.frame值与 second 的第二列和第三列中的值data.frame
  2. 然后,它会检查其中是否有任何一个FALSE同时满足这两个条件,并将它们从第一个data.frame.
  3. 然后,它按data.frame第二列对第一个排序,第二个data.frame按“min”匹配列排序。
  4. 最后,它再次检查以确保第一个数据集中的值在提供的值之间;如果不是,则删除该行。

现在,这里有一些示例数据。A并且B与您提供的数据相同。XY已为进一步测试目的进行了更改。在 和 之间的合并中XY应该只有一行。

A = read.table(header=TRUE, text="A      B
    rs10    23353
    rs100   10000
    rs234   54440")

B = read.table(header=TRUE, text="A        B      C
    E235    20000   30000
    E255    50000   60000")

X = A[c(3, 1, 2), ]
X[1, 2] = 57000
Y = B
Y[2, 3] = 55000

以下是您将如何使用该函数以及您将获得的输出。

myfun(A, B, 2, 2, 3)
#       A     B    A     B     C
# 1  rs10 23353 E235 20000 30000
# 2 rs234 54440 E255 50000 60000
myfun(X, Y, 2, 2, 3)
#      A     B    A     B     C
# 1 rs10 23353 E235 20000 30000
于 2012-08-07T19:44:26.490 回答
1

更新:这个问题比这里指出的要复杂。解决方案可以在这里找到:Merge by Range in R - Applying LoopsGenomicRanges ,并使用Bioconductor中的包交付。非常有用的包!

于 2012-08-10T00:38:29.710 回答