1
votes

Existe-t-il un moyen de compléter les nombres manquants dans une trame de données?

Je suis assez nouveau dans R, alors veuillez m'excuser si ce que je demande est quelque peu trivial. J'ai donc acquis un fichier csv contenant quelque chose comme ça à partir d'un programme d'analyse d'image:

FRAME      OBJECT_IS_IN_TARGET_AREA
1          0
2          1
3          N/A
4          N/A
5          1
6          0
7          0
...        ...
241        1

Comme vous pouvez le voir, il n'y a pas de ligne pour les images 3 et 4 et il peut y avoir des lignes manquantes plus bas jusqu'à la trame 241. Maintenant, y a-t-il un moyen de compléter la trame de données avec les lignes manquantes pour recevoir une séquence consécutive de nombres allant de 1 à 241 et affecter chaque ligne complétée N / A pour OBJECT_IS_IN_TARGET_AREA? Le bloc de données devrait ressembler à ceci à la fin:

FRAME      OBJECT_IS_IN_TARGET_AREA
1          0
2          1
5          1
6          0
7          0
...        ...
241        1

Malheureusement, il n'est pas possible d'acquérir ces valeurs directement à partir du programme d'analyse d'images, je devrais donc les ajouter manuellement. Puisque j'ai beaucoup de ces séquences, ce serait un travail très chargé. C'est pourquoi j'ai opté pour R. J'espère que vous pourrez m'aider.

Merci beaucoup,

E.


0 commentaires

3 Réponses :


4
votes

Vous pouvez utiliser complete de la bibliothèque tidyr . En supposant que le nom de votre bloc de données est df,

library(tidyr)
df %>% complete(FRAME=c(1:241))

devrait faire le travail prévu.


3 commentaires

Obtenez mon vote positif mais je pense que complete est tidyr pas dplyr , regardez ? Complete .


Oups, mon mal. Je charge souvent tidyverse , mais je sais avec certitude que complete ne vient pas de là. Merci de m'avoir corrigé.


Ou complete (FRAME = full_seq (FRAME, 1)) pour éviter d'avoir à connaître les première et dernière valeurs de FRAME .



2
votes

Je pense que vous pouvez le faire en utilisant baseR :

yourCSV <- data.frame(Frame=c(1,2,3,10,241), OBJECT_IS_IN_TARGET_AREA=c(1,2,3,4,5))

Maintenant df sera votre bloc de données complété avec NA pour les objets qui ne sont pas dans votre Frame et les valeurs de OBJECT_IS_IN_TARGET_AREA pour les valeurs de votre csv Frame.

A échantillon de yourCSV dataframe

Frame <- seq(241)
df <- data.frame(Frame=Frame)
df$OBJECT_IS_IN_TARGET_AREA <- ifelse(df$Frame %in% yourCSV$Frame, yourCSV$OBJECT_IS_IN_TARGET_AREA, NA)


0 commentaires

1
votes

Solution de base R:

df <- merge(data.frame(FRAME = c(1:nrow(df))), df, by = "FRAME", all.x = TRUE)


0 commentaires