有条件地从data.frame中删除重复项

时间:2013-01-12 01:14:33

标签: r dataframe subset

我正在尝试根据变量s的重复值来弄清楚如何对我的数据集进行子集化,同时考虑与该行关联的id

假设我的数据集是:

dat <- read.table(text = "
        id     s          
        1      2     
        1      2     
        1      1      
        1      3     
        1      3     
        1      3     
        2      3     
        2      3     
        3      2     
        3      2", 
header=TRUE)

我想要做的是,对于每个id,只保留s = 3的第一行。 dat的结果是:

        id     s          
        1      2     
        1      2     
        1      1      
        1      3         
        2      3         
        3      2     
        3      2

我曾尝试同时使用duplicated()which()来使用subset(),但我不会去任何地方。主要问题是,仅隔离s = 3“块”的第一行是不够的,因为在某些情况下(如id = 1id = 2之间)3之间的重叠id和另一个..你会采用哪种策略?

1 个答案:

答案 0 :(得分:2)

像这样:

subset(dat, s != 3 | s == 3 & !duplicated(dat)) 
#    id s
# 1   1 2
# 2   1 2
# 3   1 1
# 4   1 3
# 7   2 3
# 9   3 2
# 10  3 2

请注意subset使用起来可能很危险(请参阅Why is `[` better than `subset`?),因此版本更长但更安全:

dat[dat$s != 3 | dat$s == 3 & !duplicated(dat), ]