2017-03-29 15 views
0

後続のインスタンスを維持:、私は次のことを実行している場合ことを知っているRでの一致を使用して、私は、データフレーム持って

target <- c('b', 'a', 'd', 'c') 

new_df <- df[match(target, df$name), ] 
を:

df <- data.frame(name = c('a', 'b', 'c', 'd', 'a', 'b', 'a'), value = c(rep(TRUE, 4), rep(FALSE, 3))) 

とターゲットを

dfをターゲットの順に返しますが、最初のインスタンスのみを返します。サンプルデータでは、後で「a」と「b」のインスタンスがdf$nameにあります。どうすればそれらを保存できますか?私は彼らがどこに生まれても、彼らが残っているということだけは気にしない。任意の名前の最初のインスタンスはターゲットの順番でなければなりません( 'a'は 'd'または 'c'の前に現れなければなりません)。しかしその後は気にしません。

+0

私はコードでそれを得ることができないので、私はそれが表示されませんでしたあなたの期待出力 – akrun

+0

は何ですか。しかし、 'a'、 'c'、または 'd'のいずれのインスタンスよりも前に 'b'が表示されている限り、出力まで順応することなく柔軟に対応できます。そして 'a'は 'c'と 'd'の前に現れます。そして 'd'は 'c'の前に現れます。この場合、 'b、b、a、a、a、d、c'または 'b、a、d、b、a、a、c'となります。最初のインスタンスがターゲットの順番になっている限り、私は気にしません。 – jwells

答えて

1

これはいかがですか?

df <- data.frame(name = c('a', 'b', 'c', 'd', 'a', 'b', 'a'), 
    value = c(rep(TRUE, 4), rep(FALSE, 3))) 

target <- c('b', 'a', 'd', 'c') 

> df[unlist(sapply(target, function(e) which(df$name == e))),] 

結果:

name value 
2 b TRUE 
6 b FALSE 
1 a TRUE 
5 a FALSE 
7 a FALSE 
4 d TRUE 
3 c TRUE 
+0

素晴らしい!私は何かを思いついたが、これははるかに良いです。ありがとう! – jwells

関連する問題