2014-01-19 2 views
0

이 간단한 문제에도 불구하고 올바른 해결책을 찾을 수 없습니다.필터/하위 집합 특정 열

ID Cov1 Cov2 YN 
1004 0.45 0.21 0 
1004 0.32 0.43 1 
1007 0.36 0.47 0 
1007 0.25 0.67 0 
1009 0.56 0.34 0 
1009 0.12 0.39 1 
1021 0.16 0.31 0 
1021 0.24 0.76 1 

나는 부분 집합 또는 지정된 ID에 대해 동일한 시간에 0과 1을 포함하는이 dataframe의 해당 행을 필터링하는 데 싶습니다

나는이 약처럼 데이터를 가지고있다. 보시다시피 ID = 1007에는 두 행에 대해 YN = 0이 있으므로 이것을 제거하고 싶습니다.

나는 DF가 데이터 프레임 인 곳에서 작동하지 않는 이런 식으로 시도해 왔습니다.

답변

1

많은 솔루션이 data.table이어야합니다. 그 중 하나 -

library(data.table) 
dt <- data.table(df) 
dt2 <- dt[,Both01 := length(unique(YN)), by = 'ID'][Both01 > 1][,Both01 := NULL] 

출력 - 기본 R에서

> dt2 
    ID Cov1 Cov2 YN 
1: 1004 0.45 0.21 0 
2: 1004 0.32 0.43 1 
3: 1009 0.56 0.34 0 
4: 1009 0.12 0.39 1 
5: 1021 0.16 0.31 0 
6: 1021 0.24 0.76 1 
+0

왜 기본 R로 대답하지 않습니까? 그는 분명히 데이터 프레임을 사용하고 있습니다. – rawr

+0

저는 실제로 사람들이 data.frames를 통해 data.tables를 사용해야한다고 생각합니다. 나는 데이터의 장점을 보지 못했다. – TheComeOnMan

2

또한 사용할 수있는 도구, 예를 들어, ?ave?anyDuplicated의 조합 :

# import your example data 
df <- read.table(textConnection(" 
ID Cov1 Cov2 YN 
1004 0.45 0.21 0 
1004 0.32 0.43 1 
1007 0.36 0.47 0 
1007 0.25 0.67 0 
1009 0.56 0.34 0 
1009 0.12 0.39 1 
1021 0.16 0.31 0 
1021 0.24 0.76 1"), header=TRUE, stringsAsFactors=FALSE) 

## find IDs with duplicated YN values 
dups <- ave(df$YN, df$ID, FUN=anyDuplicated) 
dups 
# [1] 0 0 2 2 0 0 0 0 
# (a value != 0 means there is a duplicated value at position, e.g. 2) 

subset(df, dups == 0) 
# ID Cov1 Cov2 YN 
#1 1004 0.45 0.21 0 
#2 1004 0.32 0.43 1 
#5 1009 0.56 0.34 0 
#6 1009 0.12 0.39 1 
#7 1021 0.16 0.31 0 
#8 1021 0.24 0.76 1