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

标签 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 “ block ”的第一行是不够的,因为在某些情况下(如这里在 id = 1id = 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/

相关文章:

javascript - 如何使用javascript将两个数组的子集放入不同的数组中?

r - 避免 r 图中标签过度拥挤

r - 如何将多列转换为观察值

python - 在第 n 行使用 enumerate 做一些事情

python - 替换 Pandas 数据框中的列表元素

r - 过滤最接近目标值的数字并消除重复的观测值

algorithm - 什么软件算法将从一个大集合中选择不同的项目子集

R 在经过一定时间后结束重复语句

r - 在恐惧中使用colClasses

r - 在R中的数据框中进行列洗牌后删除不必要的行