2012-04-09 45 views
1

我一直在试图做到这一点,但没有得到任何地方。任何帮助将非常感激。检索使用for循环的两个数据帧之间的匹配行

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])] 
} 

不工作!

+0

你在完成数据帧之间的比较时试图完成什么?对于您的工作流程,可能比您采用的方法更简单 - 例如,如果您只需要一个数据框架中的矢量,您是否需要许多此类矢量?一个新的数据框?什么是最终目标?这个背景对你所问的问题很重要。 – 2012-04-09 20:17:37

回答

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”内容(请参阅帮助页面:?合并)。如果您希望包含df2的所有字段,则可以添加“all = TRUE”参数设置进行合并。

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

+0

是的,这正是我想要的格式。在具有6列的新数据帧中并排存在两个数据帧的匹配行将是很好的。实际上,我的最终目标要比两个数据框之间满足许多条件的比较要复杂得多。上述情况只是其中之一。 – user1079898 2012-04-09 20:18:50

+0

您发送的声明非常有效。谢谢。我很难把头围绕在它周围......但它的工作原理!非常感谢你 – user1079898 2012-04-09 20:24:04

+0

它首先很难得到(特别是如果你习惯于使用循环的另一种语言),但一旦你得到它,它非常简单。如果您有多个条件,请记住'%in%'和逻辑运算符'&'和'|'是索引中的重要工具,这是Bryan显示的方法(而不是显式循环)。 – 2012-04-09 21:13:17

相关问题