J'ai un ensemble de données avec de nombreuses installations avec un ID d'installation unique et des variables regroupées à l'ID d'installation. Je souhaite sélectionner un certain nombre d'identifiants sélectionnés au hasard, puis introduire des valeurs manquantes pour un nombre donné de valeurs déclarées au sein de l'installation.
Voici un exemple de l'ensemble de données.
h <- data.frame(cbind(FacilityID = rep(1:5,each=12),X1=rnorm(60,0,1)))
Les données ont 5 FacilityID avec 12 valeurs rapportées pour chaque ID pour une variable X1.
Je voudrais effectuer ce qui suit;
3 Réponses :
Il n'est pas clair si vous souhaitez que ces deux opérations soient effectuées ensemble ou individuellement.
Individuellement, vous pouvez faire:
IDs <- sample(unique(h$FacilityID), 3) for(i in IDs) { if(i == IDs[3]) h$X1[sample(which(h$FacilityID == i), 4)] <- NA else h$X1[sample(which(h$FacilityID == i), 3)] <- NA }
Si vous souhaitez effectuer les deux opérations à la fois sur le même jeu de données, vous pouvez faire:
# Set 3 values from 2 IDs to NA for(i in sample(unique(h$FacilityID), 2)) { h$X1[sample(which(h$FacilityID == i), 3)] <- NA } # Set 4 values from 1 ID to NA: h$X1[sample(which(h$FacilityID == sample(unique(h$FacilityID), 1)), 4)] <- NA
Cela a fonctionné aussi. Supposons qu'une troisième catégorie dise introduire 5 manquants pour un identifiant supplémentaire, comment pourrais-je ajouter le code if else. Merci beaucoup.
Vous pouvez ajouter if(i == IDs[4]) h$X1[sample(which(h$FacilityID == i), 5)] <- NA
Voici une solution tidyverse
.
Utilisez un sample
pour obtenir les 3 ID. sample(row_number()) <= 4
sélectionne au hasard 4 lignes.
library(tidyverse) ids <- sample(unique(h$FacilityID), 3) h %>% group_by(FacilityID) %>% mutate( X1 = case_when( FacilityID %in% ids[1:2] & sample(row_number()) <= 3 ~ NA_real_, FacilityID %in% ids[3] & sample(row_number()) <= 4 ~ NA_real_, TRUE ~ X1 ) )
J'obtiens "Erreur: row_number () ne doit être appelé que dans un contexte de données" lorsque je m'applique au grand ensemble de données
semblait un conflit de fonctions de dplyr avec un autre paquet. Je viens de spécifier 'dplyr ::' et j'ai travaillé
Base R:
# Set seed for reproducibility: set.seed(2020) # Store no_nas, the number of nas to introduce per facility: no_nas => integer vector no_nas <- c(rep(3, 2), 4) # Store n, the number of facilities to sample: n => integer scalar n <- length(no_nas) # Subset data.frame to records containing randomly sampled # FacilityIDs assign NA vals: facidsample => data.frame facidsample <- do.call(rbind, Map(function(x, y) { i <- h[h$FacilityID == x, ]; i$X1[sample(seq_len(nrow(i)), y)] <- NA_real_; i }, sample(unique(h$FacilityID), n), no_nas)) # Combine sampled data with original set less nullified entries: j => data.frame j <- rbind(h[h$FacilityID %in% setdiff(h$FacilityID, facidsample$FacilityID),], facidsample)