2017-02-22 3 views
1

Je me demande s'il existe un moyen de fill avec des nombres aléatoires chaque valeur manquante individuelle lors de l'utilisation dcast (bibliothèque reshape2 ou data.table). Exemple:R Dcast remplir avec un numéro d'échantillon

ID = c('AA', 'AA', 'BB', 'BB', 'CC', 'CC', 'CC', 'DD', 'DD') 
Replica = c('H1','H3','H1','H2','H1','H2','H3','H2','H3') 
Value = c(1.3, 2.5, 1.4, 3.7, 9.5, 7.4, 7.1, 1.8, 8.4) 

example <- data.frame(ID=ID, Replica = Replica, Value = Value) 

Faire simple dcast

dfdc <- dcast(data=example, ID~Replica, value.var = 'Value', fill = sample(1:10, 1)) 

Remarquez comment certaines valeurs sont ratées:

ID H1 H2 H3 
1 AA 1.3 NA 2.5 
2 BB 1.4 3.7 NA 
3 CC 9.5 7.4 7.1 
4 DD NA 1.8 8.4 

Je voudrais remplir chacune de ces valeurs manquantes avec des nombres aléatoires , quelque chose comme:

dfdc <- dcast(data=example, ID~Replica, value.var = 'Value', fill = sample(1:10, 1)) 

qui donne comme résultat:

ID H1 H2 H3 
1 AA 1.3 2.0 2.5 
2 BB 1.4 3.7 2.0 
3 CC 9.5 7.4 7.1 
4 DD 2.0 1.8 8.4 

Cependant, toutes les valeurs manquantes ont été remplacées par le même nombre aléatoire (2 dans ce cas).

Serait-il possible d'appliquer la fonction individuellement à chaque valeur manquante et, par conséquent, de remplir les valeurs manquantes avec différents nombres aléatoires?

Merci d'avance!

Répondre

3

Si vous n'êtes pas concerné par un avertissement, vous pouvez simplement faire fill = sample(10) et les valeurs inutilisées seront supprimées. Vous recevrez toujours trois nombres aléatoires. Assurez-vous simplement que vous êtes certain que l'échantillon est plus élevé que le nombre attendu de valeurs NA.

dcast(example, ID ~ Replica, fill = sample(10)) 
# ID H1 H2 H3 
# 1 AA 1.3 4.0 2.5 
# 2 BB 1.4 3.7 1.0 
# 3 CC 9.5 7.4 7.1 
# 4 DD 10.0 1.8 8.4 
# Warning message: 
# In ordered[is.na(ordered)] <- fill : 
# number of items to replace is not a multiple of replacement length 

Bien sûr, vous pouvez simplement envelopper qu'avec suppressWarnings() aussi bien.

suppressWarnings(dcast(example, ID ~ Replica, fill = sample(10))) 
# ID H1 H2 H3 
# 1 AA 1.3 6.0 2.5 
# 2 BB 1.4 3.7 5.0 
# 3 CC 9.5 7.4 7.1 
# 4 DD 9.0 1.8 8.4 
3

est ici une option à l'aide tidyverse

library(tidyverse) 
complete(example, ID, Replica) %>% 
    mutate(Value = coalesce(Value, as.numeric(sample(1:10, n(), replace=TRUE)))) %>%  
    spread(Replica, Value) 
# A tibble: 4 × 4 
#  ID H1 H2 H3 
#* <fctr> <dbl> <dbl> <dbl> 
#1  AA 1.3 2.0 2.5 
#2  BB 1.4 3.7 1.0 
#3  CC 9.5 7.4 7.1 
#4  DD 8.0 1.8 8.4