3
votes

Introduction de valeurs manquantes en utilisant le nombre d'identifiants dans R de manière aléatoire

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;

  1. Pour 2 ID sélectionnés au hasard, 3 valeurs manquantes sont attribuées de manière aléatoire dans les ID
  2. Pour 1 ID sélectionné au hasard, 4 valeurs manquantes sont attribuées au hasard dans les ID

r

0 commentaires

3 Réponses :


4
votes

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


2 commentaires

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



4
votes

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
    )
  )


2 commentaires

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é



2
votes

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)


0 commentaires