2013-04-20 58 views
3

我試圖將一個數據幀的列中的值與第二個數據幀的列中的值相匹配。棘手的部分是我想要使用第二個數據幀的子集(由正在匹配的第二個數據幀中的不同列指定)進行匹配。這與基於數據幀之間的匹配嘗試子集的常見問題不同。將一個數據幀的列中的值與另一個數據幀中的一個列的子集進行匹配

我的問題是相反的 - 我想匹配基於子集的數據幀。具體而言,我希望將第二個數據框中的列的子集與第一個數據框的整個列進行匹配,然後在第一個數據框中創建新的列,以顯示是否爲每個列創建了匹配子集。

這些子集可以有不同數量的行。使用兩個虛擬數據幀以下...

DF1 <- data.frame(number=1:10) 

DF2 <- data.frame(category = rep(c("A","B","C"), c(5,7,3)), 
        number = sample(10, size=15, replace=T)) 

...的目標是創建一個顯示是否該值DF1$number比賽在DF2$number值三個新列(DF1$ADF1$BDF$C)對於DF2$category的各個子集中的每一個。理想情況下,如果匹配成功,這些新列中的行將顯示'1',如果匹配沒有,則顯示'0'。對於下面的虛擬數據,我將以DF1爲結尾,每列有10列4列(DF1$number,DF1$A,DF1$BDF$C)。

請注意,在我實際的第二個數據框中,我有大量的類別,所以我不希望爲了完成這個目標而需要單獨輸入它們。我希望這是有道理的!對不起,如果我失去了一些明顯的東西,非常感謝您可能提供的任何幫助。

回答

2

這應該工作:

sapply(split(DF2$number, DF2$category), function(x) DF1$number %in% x + 0) 

     A B C 
[1,] 0 0 1 
[2,] 1 1 0 
[3,] 1 1 1 
[4,] 0 1 0 
[5,] 0 0 1 
[6,] 0 1 0 
[7,] 1 1 0 
[8,] 1 0 0 
[9,] 1 0 0 
[10,] 0 1 0 

您可以添加此回DF1,如:

data.frame(
    DF1, 
    sapply(split(DF2$number, DF2$category), function(x) DF1$number %in% x + 0) 
     ) 

    number A B C 
1  1 0 0 1 
2  2 1 1 0 
3  3 1 1 1 
4  4 0 1 0 
5  5 0 0 1 
6  6 0 1 0 
7  7 1 1 0 
8  8 1 0 0 
9  9 1 0 0 
10  10 0 1 0 
+0

是的,完美的作品。非常感謝!還要感謝Andy進行編輯以提高原始帖子的清晰度。 – user2093526 2013-04-21 14:49:34

+0

@ user2093526 - 沒有問題,很樂意提供幫助 - 如果這回答了問題,請在向上/向下箭頭旁邊的「勾號」上打勾來表示這個問題。 – thelatemail 2013-04-21 23:32:34

+0

可以使用_tapply_來代替'tapply(DF2 $ number,DF2 $ category,function(x)DF1 $ number%in%x + 0)' – 2017-04-10 13:05:03

相關問題