2016-09-30 10 views
-1

RではID列を含むデータフレームがある。私は同じIDを持つが、X1変数で異なるすべての行を見つける必要があります。列のデータフレームでは同じ観測値を見つけるが別の列では異なる

例えば、

d 

ID X1  X2 
a 19  F 
b 19  F 
c 16  T 
a 16  T 
a 19  T 
d 17  T 
b 15  F 
b 19  F 
c 17  T 
c 17  T 
d 17  T 
e 15  T 
f 14  T 
g 16  T 

結果は以下のようになります。

df1 

ID X1  X2 
a 19  F 
b 19  F 
c 16  T 
a 16  T 
b 15  F 
c 17  T 
+0

を '結果に含まれていない17' Dはなぜ' dput() '再現 –

+0

を容易にするために、将来的にデータを共有するために使用してください? –

+0

dはX1に同じ値を持つためです。 – Dan

答えて

3
t  <- table(d$X1, d$ID) 
t[t>1] <- 1 
t  <- apply(t,2,sum) 
t  <- t[t>1] 

d1 <- data.frame(ID = names(t)) 
d1 <- merge(d1, d, by = "ID", all.x=T,all.y=F) 
d1 <- unique(d1[,1:2]) 
d1 
ID X1 
1 a 19 
2 a 16 
4 b 15 
5 b 19 
7 c 16 
8 c 17 

我々としても3番目の列を含めることができますが、保持することのどの値を選択するためにいくつかのロジックを与える必要があると思います。たとえば、aの値が2つあり、X1は19で、1つはX2 Tで、1つはFでした。2の間で選択するには、最初に一致する行をX2のままにするか、最後にTを選択します。

+0

'a 19 'はどのように含まれていますか? '19'は' a'に2回表示されますね。 –

+0

@RonakShahはい、19は 'a'の2倍で表示され、質問に記載されているように重複しているので、結果には1倍しか表示されません。 –

0

は、この仕事をしていますか?

df1[rownames(unique(df1[,c("ID","X1")])),] 
+0

それは質問に望ましい結果をもたらさない。 'e'のように反復されないIDをフィルタリングしません。 –

1

最初に単一IDを削除できます。次に、左にあるIDの数を取得します。単一のIDは、我々はそれを削除が残っている場合:

newdf <- df1[duplicated(df1$ID, fromLast=TRUE),] 
tbl <- table(newdf$ID) 
newdf[!newdf$ID %in% names(tbl[tbl < 2]),] 
# ID X1 X2 
# 1 a 19 FALSE 
# 2 b 19 FALSE 
# 3 c 16 TRUE 
# 4 a 16 TRUE 
# 7 b 15 FALSE 
# 9 c 17 TRUE 
関連する問題