2016-07-25 3 views
0

私は2つの条件に応じてサブセットしたいR内にdata.frameを持っています:まず、行は重複してはならず、重複する場合はb == 1返される必要があります。予想される5行の代わりに、このサンプルdfの7行すべてが返されます。原因は何ですか?ループ内の2つの条件でサブセット化

編集:Sry、ループは実際に動作します。私はまだこれを最適化することができますどのように質問の2番目の部分は回答する..ですdf$b[i]を忘れてしまった;)

a <- c(rep("A", 2), "B", rep("C",2), "D", "E") 
b <- c("ws_12","dr_12","ws_12","ws_12","dr_12","ws_12","dr_12") 
df <- data.frame(a,b) 

result <- data.frame() 
for (i in seq_along(df$a)) { 
    if (duplicated2(df$a)[i] == FALSE) { 
    result <- rbind(result, df[i,]) 
    } else if (duplicated2(df$a)[i] == TRUE && substring(df$b,1,2)[i] == "ws") { 
    result <- rbind(result, df[i,]) 
    } 
} 

私はプログラミングやRへの新たなんだと、おそらくいくつかの基本的な事があります私は間違っている。これは簡単な方法でもできますか?

+1

'のDF [!重複(DFます$ a)は、]' – Sotos

+1

@Sotos我々は実行する前に、B' 'に注文する必要があるかもしれませんが、重複を削除することができます'b'が発注されていない場合のあなたのコード。 – zx8754

答えて

0

デフォルトでは、ネゲートされたduplicatedは最初に表示された行を選択します。このように、あなたの結果を達成するために、私達はちょうどorderb上と、

df <- df[order(factor(df$b, levels ='ws_12')),] 
df[!duplicated(df$a),] 
# a  b 
#1 A ws_12 
#3 B ws_12 
#4 C ws_12 
#6 D ws_12 
#7 E dr_12 
+0

これは私のサンプルデータでは有効ですが、実際のデータでは有効ではありません.b値は1,2ではなく文字値です。したがって、私はそれをある状態で解決したいと思っています。 – andrasz

+0

さて、文字を含むサンプルデータフレームを含める必要があります。 – Sotos

+0

何を保存しますか? 'dr_12'または' ws_12'ですか? – Sotos

関連する問題