1

我一直在尝试这样做,但没有成功。任何帮助将不胜感激。

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)

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

我已经尝试过使用 for 循环,如下所示:

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

不工作!

4

1 回答 1

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”引用了 df2(外键)中与 df1 相关联但与之不同的信息。而不是如上面的合并所示,重复 df2 的信息,我们可以在需要时简单地访问它。这就是合并方便的地方。

于 2012-04-09T20:16:19.537 回答