Tengo una variable en un marco de datos que se parece a esto

x=c(1,2,4,6,7,NA,NA,5,NA,NA,9)

Cada elemento en x es un número único y quiero reemplazar NA con números únicos.

Lo que he intentado es algo como esto, pero me preguntaba si hay una forma más eficiente de hacerlo.

x[is.na(x)]=sample(10:15,replace=F)
Warning message:
In x[is.na(x)] = sample(10:15, replace = F) :
  number of items to replace is not a multiple of replacement length

¡Gracias!

6
user3641630 30 ene. 2016 a las 04:12

2 respuestas

La mejor respuesta

Si "cuenta" el número de elementos (la suma de is.na parece un buen método de recuento) para muestrear su conjunto de valores candidato, no obtendrá el error:

x[is.na(x)] <- sample(10:15, size=sum(is.na(x)), replace=F)

> x
 [1]  1  2  4  6  7 12 14  5 11 13  9
9
IRTFM 30 ene. 2016 a las 15:58

Puede recorrer y crear un vector de índices de valores perdidos y luego pasar ese vector a replace() con random() anidado adentro para generar los números aleatorios con los que debe reemplazar los valores perdidos.

# data
x=c(1,2,4,6,7,NA,NA,5,NA,NA,9)
# vector of missing values
v <- NULL
# loop to find missing value indices
for(i in 1:length(x)){
  if(is.na(x[i])==TRUE)
    v <- append(v, i)
}
# replace missing values with a random integer
xnew <- replace(x, v, sample(10, length(v), replace = FALSE))



x
>> 1  2  4  6  7 NA NA  5 NA NA  9
xnew
>> 1  2  4  6  7  5 10  5  4  2  9
0
Imad Ali 30 ene. 2016 a las 06:07