使用for循环检索两个数据帧之间的匹配行

时间:2012-04-09 20:05:57

标签: r

我一直试图这样做,但没有到达任何地方。任何帮助将非常感谢。

df1 <- data.frame(chrom = "chr1", start=c(10,20,30), end = c(100,200,300), stringsAsFactors=FALSE)
df2 <- data.frame(chrom = c("chr1", "chr2", "chr3"),start=c(15,500,150), end = c(75,1000,300), stringsAsFactors=FALSE)

我希望获得df1$chrom == df2$chrom所有df2行。或者更好的是:我想在新的向量中生成输出并显示df1的行,然后是df2,反之亦然df1$chrom == df2$chrom

我使用for循环尝试了这个,如下所示:

for(i in 1:nrow(df2)){
    x[i] <- df2[which(df1$chrom == df2$chrom[i])]
}

不工作!

1 个答案:

答案 0 :(得分:3)

这是你想要的吗?

df2[df2$chrom == df1$chrom, ]
#   chrom start end
# 1  chr1    15  75

根据您的评论,您可能还想尝试以下操作。

merge(df1, df2, by = 'chrom')

这将在两个帧(“表”)上进行数据库“连接”。结果就是这样。

  chrom start.x end.x start.y end.y
1  chr1      10   100      15    75
2  chr1      20   200      15    75
3  chr1      30   300      15    75

采用R并不总是一种有效的方法,但它很方便。您可以使用参数控制“.x”内容(请参阅帮助页面:?merge)。如果您希望包含df2中的所有字段,则可以添加“all = TRUE”参数设置以进行合并。

正如我之前提到的,最好考虑整体方法。这不一定是处理数据的有效方法,因为现在您已在结果框架中输入了大量冗余。相反,在数据库术语中,我们将df2视为“查找”表。 df1中的“chr1”引用与df1相关但与其不同的df2(外键)中的信息。而不是像上面的合并所示,重复了df2的信息,我们可以在需要时简单地访问它。这是合并使方便的地方。