2

我试图弄清楚如何根据变量的重复值对我的数据集进行子集化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 = 1and之间id = 2)3 在一个 id 和另一个之间的重叠。你会采用哪种策略?

4

1 回答 1

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可能很危险(请参阅为什么 `[` 比 `subset` 更好?),因此更长但更安全的版本是:

dat[dat$s != 3 | dat$s == 3 & !duplicated(dat), ]
于 2013-01-12T01:37:54.503 回答