2017-09-08 42 views
-1

私は条件付きで別の列の値に基づいて重複した行を削除する必要があるデータセットを持っています。条件付きで重複を削除するR

具体的には、SampleIDが複製されている場合は、サイズが0のIF(かつその場合のみ)の行を削除する必要があります。

SampleID<-c("a", "a", "b", "b", "b", "c", "d", "d", "e") 
size<-c(0, 1, 1, 2, 3, 0, 0, 1, 0) 
data<-data.frame(SampleID, size) 

I want to delete rows with: 
Sample ID size 
a   0 
d   0 

And keep: 
SampleID size 
a   1 
b   1 
b   2 
b   3 
c   0 
d   1 
e   0 

実際のデータセットは非常に大きいので、既知の行を行番号だけ削除する方法はありません。

+3

再現可能な例をお読みください:https://stackoverflow.com/help/how-to-ask –

+0

最後のコメントを明確にする:あなたが指定したコードは実行されません。投稿前の新しいRセッションのテスト例。 – Frank

答えて

0

data.tableフレームワークを使用する:data.table

require(data.table) 
setDT(data) 

にあなたのセットを変換行を削除できるIDのリストを作成します。

dropable_ids = unique(data[size != 0, SampleID]) 

not(a and b)a or bと同等であることに注意してくださいしかしdata.tableフレームワークはよくorを処理しませんしてくださいdropableリストまたは非0値

data = data[!(SampleID %in% dropable_ids & size == 0), ] 

とされていません。

希望します

0

data.tableずにベースRで動作し、Rスタータ用のフォロースルーしやすいソリューション:

#Find all duplicates 

data$dup1 <- duplicated(data$SampleID) 
data$dup2 <- duplicated(data$SampleID, fromLast = TRUE) 
data$dup <- ifelse(data$dup1 == TRUE | data$dup2 == TRUE, 1, 0) 


#Subset to relevant 

data$drop <- ifelse(data$dup == 1 & data$size == 0, 1, 0) 
data2 <- subset(data, drop == 0) 
関連する問題