我正在尝试找出如何根据变量 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
“ block ”的第一行是不够的,因为在某些情况下(如这里在 id = 1
和 id = 2
) 一个 id 和另一个 id 之间的 3 重叠。您会采用哪种策略?
最佳答案
像这样:
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), ]
关于r - 有条件地从 data.frame 中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14289182/