2017-11-11 76 views
0

我想檢查一個數據幀(「apx」)中是否有任何行,其中來自apx中「AD」列的條目與條目匹配在另一個數據幀(「npx」)的「AD」列中,AND,其中來自匹配行的SD條目在另一個數據幀的13個單位內。根據多個選擇條件匹配的兩個不同數據框中的行建立第三個數據幀

我檢查過幾個不同的參考,但由於我需要建立第三個數據幀(和其他原因),找不到答案。

我的工作試用這個...

 npx <- data.frame(TN = c(111, "Z2", 4, "fox", 34256, 4782, "ZGJU45"), 
       SD=c(100, 200, 100, 600, 500, 115, 455), 
       AD=c("34YY", "37PD", "123M", "235W", "37PD", "123M", "1WW")) 


     apx <- data.frame(TN = c(222, "X34", 5, "bear", 47789, 37281, "VF456"), 
       SD = c(101, 201, 310, 450, 515, 660, 505), 
       AD = c("123M", "23XY", "5S S", "1WW", "27 30R", "14M", "37PD")) 

注:AD輸入 「123M」 「1WW」 和 「37PD」 出現在APX和NPX。第一個和第三個在npx中出現兩次。

投保因素改變字符:

 i <- sapply(apx, is.factor) 
     apx[i] <- lapply(apx[i], as.character) 
     i <- sapply(npx, is.factor) 
     npx[i] <- lapply(npx[i], as.character) 

我的第五次嘗試...(強制SD條目爲整數)...

 test5 <- apx[which(apx$AD == npx$AD & 
       as.integer(npx$SD) - as.integer(apx$SD) < 13) 
     %in% as.integer(npx$SD), ] 

我的一個較早的嘗試....

 test3 <- apx[which(apx$AD == npx$AD & 
       as.integer(npx$SD) - as.integer(apx$SD) < 13) 
     %in% setequal(npx$SD, apx$SD), ] 

什麼,我在第三個數據幀尋找的是....

   TN  SD  AD 
     [1] 222 101 123M 

因爲123M(apx的第一行)在npx的第三行中找到,SD的對應條目在彼此的13個單元(100和101)內;然而,在第二次出現123M的npx(第六行)中,SD的相應條目之間的差異相距15個單位。實際上,我僅查找那些npx中的SD條目大於(僅)比apx中的相應SD條目更大的實例。

 [2] bear 450 1WW  

因爲1WW(APX的第四行)的NPX最後一行和用於SD的相應條目中找到的是內13個單位彼此(450和455)的。

 [3] VF456 505 37PD 

雖然37PD(APX的最後一行)NPX的第二行中被發現,該條目不質量37PD因爲相應的SD值是超過13個單位間隔(200和505);然而,npx(第五行)中37PD的其他外觀的SD的相應條目在彼此的13個單位內,從而限定37PD出現在結果數據幀中。

我在咬牙切齒,期待有人向我展示一種非常簡單的方法來做到這一點,但是比旋轉更多的輪子還要遭受尷尬。提前致謝。

回答

1

如果我理解你想要做什麼,我想我們可以用mergesubset功能:

merge_df <- merge(npx, apx, by = 'AD', suffixes = c('npx','apx')) 

subset(merge_df, SDnpx - SDapx <= 13 & SDnpx >= SDapx) 

    AD TNnpx SDnpx TNapx SDapx 
3 1WW ZGJU45 455 bear 450 

但我得承認,我真的不很明白正是你的狀況你正試圖執行。如果我們感興趣的是其中有一個SD區別< = 13行,那麼我們可以做到以下幾點:

subset(merge_df, abs(SDnpx - SDapx) <= 13) 

    AD TNnpx SDnpx TNapx SDapx 
1 123M  4 100 222 101 
3 1WW ZGJU45 455 bear 450 
5 37PD 34256 500 VF456 505 

然後獲取數據到您最終希望的形式(這是不是很清楚要麼)僅僅是重命名和/或刪除data.frame中的列。

相關問題