首页 > 解决方案 > 根据存在层次结构的另一列删除一列中的重复项

问题描述

我有一个这样的数据框:

dat1 <- data.frame(Unit = c("a","a","b","c","c","c","d"), Habitat = c("choppy sands","sands","meadow","sands","meadow","choppy sands","choppy sands"), Litter = c(3.7,3.4,5.6,2.1,3.6,7.5,1.2))

>dat1
  Unit      Habitat Litter
1    a choppy sands    3.7
2    a        sands    3.4
3    b       meadow    5.6
4    c        sands    2.1
5    c       meadow    3.6
6    c choppy sands    7.5
7    d choppy sands    1.2

我想根据 Unit 查找和删除重复的行,其中为 Unit 的每个值保留的单行取决于 Habitat 中的值层次结构。如果存在基于单位的重复行,则 Habitat = "meadow" 的行优先,然后是 Habitat = "choppy sands" 的行,然后是 Habitat = "sands" 的行。因此生成的数据框将如下所示:

  Unit      Habitat Litter
1    a choppy sands    3.7
2    b       meadow    5.6
3    c       meadow    3.6
4    d choppy sands    1.2

非常感谢任何帮助。

标签: rfilterduplicates

解决方案


使用dplyrand forcats(都在tidyverse软件包系统中),您可以执行以下操作:

dat2 <- 
    dat1 %>%
    mutate(Habitat = fct_relevel(Habitat, c('meadow', 'choppy sands', 'sands'), after=0L)) %>%
    group_by(Unit) %>%
    filter(as.numeric(Habitat) == min(as.numeric(Habitat)))

这给出了所需的输出。这个想法是你制作Habitat一个因子变量并在这个变量的级别中编码你的层次结构。然后,(在每个组内),您通过使用规则进行过滤来Unit保留具有最高优先级的行。Habitatas.numeric(Habitat) == min(as.numeric(Habitat))


推荐阅读