尽管有这个非常简单的问题,我找不到正确的解决方案。
我的数据看起来像这样:
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")
答案 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