2 votes

Comment supprimer les lignes dupliquées d'un dataframe `df` mais seulement lorsqu'une colonne spécifique du `df` est NA ?

J'ai un cadre de données df avec 5 colonnes. Region.Label indique la région où l'étude a été réalisée, Sample.Label est une zone spécifique de cette région où j'ai compté les oiseaux, Sp est l'espèce d'oiseau que j'ai trouvée dans cette zone spécifique, Distance est la distance entre l'oiseau et moi, et Effort est l'époque où j'étais dans la région à la recherche d'oiseaux. Quand Distance es NA signifie que l'espèce n'a pas été observée dans cette zone. Voici un exemple de cadre de données que j'ai :

df <- data.frame(Region.Label=c("A","A","A","A","A","A","A","A"),
                 Sample.Label=c(1,1,1,2,2,2,3,3),
                 Sp=c("ZZ","ZZ","BB","ZZ","BB","CC","ZZ","BB"),
                 Distance=c(2,7,NA,NA,NA,6,NA,NA),
                 Effort=c(99,99,99,87,87,87,72,72))

df$Region.Label <- as.factor(df$Region.Label)
df$Sample.Label <- as.numeric(df$Sample.Label)
df

  Region.Label Sample.Label Sp Distance Effort
1            A            1 ZZ        2     99
2            A            1 ZZ        7     99
3            A            1 BB       NA     99
4            A            2 ZZ       NA     87
5            A            2 BB       NA     87
6            A            2 CC        6     87
7            A            3 ZZ       NA     72
8            A            3 BB       NA     72

Ici, je voudrais supprimer toutes les lignes qui ont NA pour la colonne df$Distance car il indique que l'espèce n'a pas été observée dans la zone, mais je veux supprimer les lignes avec NA para df$Distance lorsque cette rangée avec le NA est un doublon d'une autre ligne excluant la colonne df$Sp .

J'aimerais l'obtenir :

 Region.Label Sample.Label Sp Distance Effort
1            A            1 ZZ        2     99
2            A            1 ZZ        7     99
3            A            2 CC        6     87
4            A            3 ZZ       NA     72

Dans cet exemple, je ne supprime pas df[7,] parce que le Sample.Label est différente des lignes précédentes. J'enlève df[8,] porque df[7,] y df[8,] sont égaux, à l'exception de df$Sp .

Quelqu'un sait-il comment obtenir ce que je veux ?

2voto

akrun Points 148302

Il serait peut-être utile de procéder à un regroupement par opération - par "Région.étiquette", "Échantillon.étiquette", "Effort", filter les éléments non-NA de "Distance" s'il y a des éléments non-NA ou sinon la première ligne ( row_number() == 1 )

library(dplyr)
df %>% 
 group_by(Region.Label, Sample.Label, Effort) %>% 
 filter(if(all(is.na(Distance))) row_number() == 1 else !is.na(Distance)) %>%
 ungroup

-sortie

# A tibble: 4 × 5
  Region.Label Sample.Label Sp    Distance Effort
  <fct>               <dbl> <chr>    <dbl>  <dbl>
1 A                       1 ZZ           2     99
2 A                       1 ZZ           7     99
3 A                       2 CC           6     87
4 A                       3 ZZ          NA     72

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X