2016-10-21 6 views
0

Rのforループでいくつかの行を削除しようとしています。条件付きでそれを下の行と比較するので、角カッコでフィルタリングできません。変数名を使用してR内の行を削除しようとしています

定数が指定されている場合、行を削除できることがわかります:dataframe[-2, ]。変数を使って同じことをしたいだけです:dataframe[-x, ]

for (j in 1:(nrow(referrals) - 1)) { 
    k <- j + 1 
    if (referrals[j, "Client ID"] == referrals[k, "Client ID"] & 
     referrals[j, "Provider SubCode"] == referrals[k, "Provider SubCode"]) { 
    referrals[-k, ] 
    } 
} 

コードは不満なく実行されますが、行は削除されません(いくつかはわかっていることがわかります)。もちろん、定数でテストすれば、うまく動作します:referrals[-2, ]

+1

だけで実行されている '紹介は[-k、]'、実際には何もしません。 Rの中のものと同様に、オブジェクトを変更したい場合は、そのオブジェクトに 'referral < - referrals [-k、]'のように_assign_する必要があります。 – joran

+1

...私は、このコードが固定されていても期待通りに動作することはわかりません。 – joran

+1

1つのラウンドで 'k'行を削除すると、次のラウンドでは 'j'が最後の 'k'になります。したがって、あなたのデータフレームは、forループ範囲で指定した行数と同じ数で終わることはなく、 'subscript out of bounds'エラーが発生します。ですから、@ joranが言ったように、あなたはコードを再フォーマットすることを検討します。 – Facottons

答えて

0

作業する人にはreproducible exampleを追加する必要があります。私はあなたのデータの構造を知らないので、これがあなたのために働くかどうかしかわかりません。コメントで指摘された理由から、私はループを使用しません。最初に削除する行を特定し、通常の方法で削除します。考えてみましょう:あなたがしたい場合は、重複した結果、実行、

duplicated.rows <- duplicated(referrals) 

その後:しかし

referrals.double <- referrals[duplicated.rows, ] 

あなたによって与えられたすべての情報を使用して

set.seed(4499) # this makes the example exactly reproducible 
d <- data.frame(Client.ID  = sample.int(4, 20, replace=T), 
       Provider.SubCode = sample.int(4, 20, replace=T)) 
d 
# Client.ID Provider.SubCode 
# 1   1    1 
# 2   1    4 
# 3   3    2 
# 4   4    4 
# 5   4    1 
# 6   2    2 
# 7   2    2 # redundant 
# 8   3    1 
# 9   4    4 
# 10   3    4 
# 11   1    3 
# 12   1    3 # redundant 
# 13   3    4 
# 14   1    2 
# 15   3    2 
# 16   4    4 
# 17   3    4 
# 18   2    2 
# 19   4    1 
# 20   3    3 
redundant.rows <- with(d, Client.ID[1:nrow(d)-1]==Client.ID[2:nrow(d)] & 
          Provider.SubCode[1:nrow(d)-1]==Provider.SubCode[2:nrow(d)]) 
d[-c(which(redundant.rows)+1),] 
# Client.ID Provider.SubCode 
# 1   1    1 
# 2   1    4 
# 3   3    2 
# 4   4    4 
# 5   4    1 
# 6   2    2 
# 8   3    1 # 7 is missing 
# 9   4    4 
# 10   3    4 
# 11   1    3 
# 13   3    4 # 12 is missing 
# 14   1    2 
# 15   3    2 
# 16   4    4 
# 17   3    4 
# 18   2    2 
# 19   4    1 
# 20   3    3 
0

、私はこれは良い選択肢かもしれないと考えています重複しない結果を表示したい場合は、

referrals.not.double <- referrals[!duplicated.rows, ] 

あなたがステップバイステップに行くことを好む場合は(多分それはあなたのために興味深いです):

duplicated.rows.Client.ID <- duplicated(referrals$"Client ID") 

duplicated.rows.Provider.SubCode <- duplicated(referrals$"Provider SubCode") 

referrals.not.double <- referrals[!duplicated.rows.Client.ID, ] 

referrals.not.double <- referrals.not.double[!duplicated.rows.Client.ID, ] 
+1

これは私が書いたものに似ています。しかし、議論された2つの変数がデータセット内の唯一の変数であることは明らかではないので、duplicated()がOPのために機能することは明らかではない。再現可能な例は、物事を明確にするのに役立ちます。 – gung

関連する問題