2014-07-08 43 views
3

如何獲取兩個數據幀的共享行的邏輯?兩個數據幀的共享行的邏輯

> a <- data.frame(x = 1:5, y = 7:11) 
> b <- data.frame(x = c(4, 2, 6, 3, 3, 1), y = c(10, 16, 7, 9, 9, 7)) 
> a 
    x y 
1 1 7 
2 2 8 
3 3 9 
4 4 10 
5 5 11 
> b 
    x y 
1 4 10 
2 2 16 
3 6 7 
4 3 9 
5 3 9 
6 1 7 
> a.indices <- c(TRUE, FALSE, TRUE, TRUE, FALSE) 
> b.indices <- c(TRUE, FALSE, FALSE, TRUE, TRUE, TRUE) 

我想返回a.indices或b.indices。

+0

根據你的下一步是什麼,你可能想嘗試'merge(b,a)'。這和'b [b.indices,]'很相似。 – bdemarest

+0

@bdemarest - 'merge'好像暗示自己在這裏 - 我已經添加了一個答案,以確切的問題結合它。 – thelatemail

回答

2

你可以做什麼merge%in%確實

a.indices <- match(
    do.call(paste, c(a, sep="\r")), 
    do.call(paste, c(b, sep="\r")), nomatch=0 
)>0 

您結合行的combinaton成一個單一的值,然後使用匹配來比較一組到其他。你也可以做

b.indices <- Reduce(function(vprev,vnow) vprev & !is.na(vnow), 
    Map(match, b,a), init=T) 

(對於這兩種方法都可以互換ab得到相反的結果)。您可能希望測試以比較特定場景中的性能。

+0

您的第一個解決方案適用於我,但我不理解它。功能如何實現.call,paste和c都可以一起工作? c(a,sep =「\ r」)創建一個列名爲x,y和sep的數據框。 do.call將粘貼應用於數據框的三列。 我誤解了什麼? – George

+1

do.call採用函數和列表並使用列表中的值作爲參數調用函數。所以本質上它調用'paste($ x,$ y,sep =「\ r」)'但這樣它可以適用於任意數量的列。它將所有的列變成一個巨型列(向量),因爲「匹配」僅適用於原子向量。另外'c(a,sep =「\ r」)'不會向data.frame'a'添加一列。它將'a'轉換爲一個簡單的列表,然後向該列表中添加一個附加元素。我們絕不會在「a」(或「b」)中添加新列。 – MrFlick