过滤器/子集特定列

时间:2014-01-19 18:38:23

标签: r

尽管有这个非常简单的问题,我找不到正确的解决方案。

我的数据看起来像这样:

 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")

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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