2016-05-13 19 views
1

2つの列に部分一致または不一致がある行を選択する方法を探しています。 (例として)私のデータセットは以下のようになります。私は_05_15ためplot1plot2の唯一の「マッチ」ペアを含むサブセットを作成したい部分一致/不一致の行を2列に選択する

df = data.frame(plot1 = c("ABX_15", "BHE_05", "ABX_15"), 
       plot2 = c("AB6_15", "JKS_05", "JKS_05"), 
       value = c(0.4, 0.45, 0.34)) 

。これは、例の最初の行か2番目の行になります。 plot1plot2のミスマッチを持つ行だけを選択する必要があります。これは行番号3です。ミスマッチと一致するのは、プロット名の2番目の部分のみです。

部分的な選択と、列に応じた特定の行の選択のためのソリューションが見つかりましたが、両方を組み合わせることはできませんでした。

データセットの3つのサブセットが必要です:一致するものが_05であり、一致するものが_15であり、もう1つがミスマッチです。

+0

期待される出力は? – mtoto

+0

私はデータセットの3つのサブセットを期待しています:1つは_15と一致する_15、もう1つはミスマッチです –

+0

@NRコメントに追加情報を投稿しないでください[編集リンク](http://stackoverflow.com/posts/37206518/edit)次回は質問を更新します。 – Jaap

答えて

1

別の解決策は、前のすべてを取り除くためにsubを使用して(を含む)された二つの変数からアンダースコアとそれらのsubステートメントを==と比較して、論理インデックスベクトルを作成します。

idx <- sub('.*\\_', '', df$plot1) == sub('.*\\_', '', df$plot2) 

dfをそのベクターでサブセット化することができます。 df[idx,]が与える:

plot1 plot2 value 
1 ABX_15 AB6_15 0.40 
2 BHE_05 JKS_05 0.45 

不一致を取得するには、df[!idx,]使用することができます:あなたの要件の更新毎の

plot1 plot2 value 
3 ABX_15 JKS_05 0.34 

を、あなたは次のように15または05に一致させるためのインデックスを作成することができます。

idx15 <- sub('.*\\_', '', df$plot1) == '15' & sub('.*\\_', '', df$plot2) == '15' 
idx05 <- sub('.*\\_', '', df$plot1) == '05' & sub('.*\\_', '', df$plot2) == '05' 

T上記のようにサブセットdfに使用することができます。 df[idx15,])。ミスマッチを取得するには:df[!idx05 & !idx15,](または上記の方法を使用してください)。

+0

あなたの更新のためのタクの - 私はちょうどコメントの質問に答えた。あなたの解決策の調整は問題ではありませんでした。私は少し違っていましたが、 'id05 < - sub( '。* \\ _ 05'、 ''、df $ plot1)== sub( '。* \\ _ 05'、 ''、df $プロット2) '。とにかくありがとうございました! –

0

拳は名前によってパターン_をこぼした。私はここでstringrパッケージのstr_splitファンクションを使用しています。結果はリストです。今すぐ名前の2番目の部分を抽出することができます。あなたの代わりにstrspilt機能を使用することができますベースのR・ソリューションについて

df$p1 <- unlist(lapply(str_split(df$plot1, "_"), "[", 2)) 
df$p2 <- unlist(lapply(str_split(df$plot2, "_"), "[", 2)) 

:unlistingした後、あなたのデータフレームdfに結果を追加することができます。文字ベクトルを作成する必要があることに注意してください。

unlist(lapply(strsplit(as.character(df$plot1), "_"), "[", 2)) 

と結果:不一致用の

df[df$p1 == df$p2, ] 
    plot1 plot2 value p1 p2 
1 ABX_15 AB6_15 0.40 15 15 
2 BHE_05 JKS_05 0.45 05 05 

df[df$p1 != df$p2, ] 
    plot1 plot2 value p1 p2 
3 ABX_15 JKS_05 0.34 05 15 
関連する問題