2017-11-11 5 views
0

apxの「AD」列からのエントリがエントリと一致する1つのデータフレーム(「apx」)別のデータフレーム(「npx」)内の「AD」列に、一致した行からのSDエントリが他方の13単位内にあるANDである。複数の選択基準に一致する2つの異なるデータフレームの行に基づいて第3のデータフレームを構築する

私はSOに関するいくつかの異なるリファレンスを確認しましたが、第3のデータフレーム(およびその他の理由)を構築する必要があるため、回答が見つかりませんでした。

私の作業裁判はこれである...

 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に表示されます。これらの1番目と3番目はnpxで2回表示されます。

は要因が文字に変更されている保険をかけ:

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

れる....

第3行のnpxに123M(apxの第1行)があり、SDの対応するエントリが互いに13単位(100および101)内にあるので、3210
   TN  SD  AD 
     [1] 222 101 123M 

です。しかし、npxの123M(6行目)の2番目の発生時には、SDの対応するエントリの差は15単位離れています。実際には、npxのSDエントリがapxの対応するSDエントリよりも大きい(唯一の)<であるインスタンスだけを探しています。

 [2] bear 450 1WW  

1WW(APXの4行目)はNPXの最後の行に見出されるとSDに対応するエントリが互いに13単位(450及び455)内にあるからです。

 [3] VF456 505 37PD 

37PD(APXの最後の行)はNPXの第2行に見出されているが、対応するSD値が離れて13単位(200及び505)を超えているので、そのエントリが品質37PDがありません。しかし、npx(行5)の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 

しかし、私は実際には非常にだけで何あなたの条件を理解していないことを認めますよあなたは強制しようとしています。ただで

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 

その後(のいずれか非常に明確ではありません)あなたの最終的な所望のフォームにデータを取得:我々はSD差< = 13を持つ行に興味があるなら、我々は次の操作を行うことができますdata.frameから列の名前を変更したり削除したりできます。

関連する問題