比较两个数据框并在单个列的匹配值中打印特定行

时间:2013-03-25 21:53:16

标签: r

我对R来说是全新的,并希望得到一些帮助!我正在尝试比较两个大型数据帧(仅前几行):

d1

LOC.ID
LOC_O1
LOC_O34
LOC_O36
LOC_O78
LOC_O234
LOC_O235
LOC_O2353.1

...

d2

locus.V.6   V6..model   start   end
LOC_O1      LOC_O1.1    1903    9817
LOC_O234    LOC_O234.1  1903    9817
LOC_O24     LOC_O24.2   10218   11435
LOC_O459    LOC_O459.1  11648   14915
LOC_O34     LOC_O34.2   15292   19323
LOC_O44     LOC_O44.1   15292   1932

无论如何,我想将d1的第1列中的值与d2的第1列和第2列中的值进行比较,然后如果d2的第1列或第2列中存在匹配,则打印所有d2数据在那一行。

我不知道如何使用if ... then语句或循环,或者这应该相对简单。任何帮助,将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:3)

data.tableskeys一起使用。

  

它以简短灵活的语法提供快速子集,快速分组,快速更新,快速排序的连接和列表列,以加快开发速度。它的灵感来自R中的A [B]语法,其中A是矩阵,B是2列矩阵

假设您要匹配LOC.IDlocus.V.6

library(data.table)
d1 <- data.table(d1, key = 'LOC.ID')
d2 <- data.table(d2, key = 'locus.V.6')
# nomatch = 0 means non-matches will not be returned
# mult = 'first' or 'last' may also be useful, if you only want these
d2[d1, nomatch=0]

   locus.V.6  V6..model start   end
1:    LOC_O1   LOC_O1.1  1903  9817
2:  LOC_O234 LOC_O234.1  1903  9817
3:   LOC_O34  LOC_O34.2 15292 19323


# the default value for `nomatch` is NA (just like when you use the function match)
# this now has NA values for non-matching rows
d2[d1] 
     locus.V.6  V6..model start   end
1:      LOC_O1   LOC_O1.1  1903  9817
2:    LOC_O234 LOC_O234.1  1903  9817
3:    LOC_O235         NA    NA    NA
4: LOC_O2353.1         NA    NA    NA
5:     LOC_O34  LOC_O34.2 15292 19323
6:     LOC_O36         NA    NA    NA
7:     LOC_O78         NA    NA    NA

答案 1 :(得分:1)

你可以试试这个

match <- d2[,1] %in% d1[,1] | d2[,2] %in% d1[,1]
d2[index,]

d1[,x]是数据框x的第d1列。 x%in%y检查x中的哪些元素也在y中。首先,我们首先检查d1[,1]d2[,1]d2[,2]中的哪些行,然后显示这些行。