J'ai une trame de données comme celle-ci:
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
Je souhaite rechercher et supprimer les lignes en double en fonction de l'unité où la ligne unique à conserver pour chaque valeur d'unité dépend d'une hiérarchie de valeurs dans Habitat. S'il y a des lignes dupliquées basées sur l'Unité, une ligne où Habitat = "prairie" a la priorité, puis une ligne où Habitat = "sables agités", puis une ligne où Habitat = "sables". Ainsi, la trame de données résultante ressemblerait à ceci:
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
Toute aide très appréciée.
En utilisant dplyr
et forcats
(tous deux dans le tidyverse
système de packages), vous pouvez faire quelque chose comme ceci:
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)))
Cela donne la sortie souhaitée. L'idée est de créer Habitat
une variable de facteur et d'encoder votre hiérarchie dans les niveaux de cette variable. Ensuite, (dans chaque Unit
groupe), vous conservez les lignes qui ont la priorité la plus élevée Habitat
en filtrant à l'aide de la as.numeric(Habitat) == min(as.numeric(Habitat))
règle.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots