2014-01-19 87 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的那些行。正如你可以看到兩行ID = 1007的YN = 0,所以我想刪除它。

我曾嘗試過其他一些東西,這是不行的,其中DF是數據框。

subset(DF, DF$YN=="1"&DF$YN=="0") 

回答

1

data.table必須有大量的解決方案。其中之一 -

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

輸出 -

> 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.frame上使用data.tables。我沒有看到數據表的data.frames的優點。 – TheComeOnMan

2

你也可以使用從基礎R工具,例如?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