我正在尝试根据变量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 = 1
和id = 2
之间)3之间的重叠id和另一个..你会采用哪种策略?
答案 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), ]