【问题标题】:Conditionally dropping duplicates from a data.frame有条件地从 data.frame 中删除重复项
【发布时间】:2013-01-12 01:14:33
【问题描述】:

我试图弄清楚如何根据变量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 和另一个id 之间重叠。你会采取什么策略?

【问题讨论】:

  • 在 id=1 where s=2 和 id=3 where s=2 中也有重复,你想保留这些还是删除它们?
  • 是的,我想保留它们,谢谢

标签: r dataframe subset


【解决方案1】:

像这样:

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), ]

【讨论】:

  • 非常感谢!也用于链接
  • 抱歉,我不知道,我得看看你的数据。
猜你喜欢
  • 2018-02-17
  • 2021-01-23
  • 2020-12-07
  • 2019-12-03
  • 2020-10-11
  • 2014-05-12
  • 1970-01-01
  • 2020-05-22
  • 2017-10-23
相关资源
最近更新 更多