Foro de debate

Sustitución de NaN e Inf

 
Imagen de Liliana Muñoz
Sustitución de NaN e Inf
de Liliana Muñoz - miércoles, 26 de septiembre de 2018, 18:57
 

Hola! recién estoy aprendiendo a utilizar R, estoy haciendo un código en el cual agrego dos columnas a mi dataframe con operadores aritméticos, cuando extraigo esas columnas en una tabla el resultado de esas divisiones me da como resultado en algunos casos NaN o Inf, por lo cual quiero reemplazarlos. He intentado con avst18[is.na(avst18)]<-0, pero eso es para datos faltantes y en este caso la división tiene los siguientes casos 0/0 (Tanto el target como el avance están en cero) o X/0 (target tiene un monto y pautado está en 0); mi intenciónes que ne el avance tenga un cero. He intentado con is.nan e is.infinite pero me sale este error.  Error in is.nan(avst18): default method not implemented for type 'list' calls: <Anonymous> ... withVisible -> eval ->eval->[<-->[<-.data.frame

Podrían, por favor, apoyarme con esto, debe ser algo muy básico pero nunca fui buena programando y recién estoy aprendiendo en R. Mil gracias.

P.D.: Estoy utilizando la paquetería Dplyr

Imagen de Manuel Muñoz Márquez
Re: Sustitución de NaN e Inf
de Manuel Muñoz Márquez - jueves, 27 de septiembre de 2018, 11:46
 

Buenas Liliana:

Si pusieras un trozo de código reproducible sería más fácil ayudarte.

Creo que tu problema se debe a que en un data.frame no se puede modificar parte de una columna, hay que modificarla entera o un único elemento.

Por ejemplo:

> d <- data.frame(i=1:10, i2=(1:10)^2)
> d
    i  i2
1   1   1
2   2   4
3   3   9
4   4  16
5   5  25
6   6  36
7   7  49
8   8  64
9   9  81
10 10 100
> d[1,1:5] <-0
Error in `*tmp*`[[j]] : falló indexación recursiva en nivel 2

Se puede observar como al intentar modificar parte de la columna 1 se produce un error. Esta puede ser tu situación al intentar modificar parte de la columna. Se puede hacer utilizando una columna temporal, por ejemplo,

x <- d[,1]
> x[1:5] <- 0
> d[,1] <- x
> d
    i  i2
1   0   1
2   0   4
3   0   9
4   0  16
5   0  25
6   6  36
7   7  49
8   8  64
9   9  81
10 10 100

Un saludo.

Imagen de Liliana Muñoz
Re: Sustitución de NaN e Inf
de Liliana Muñoz - jueves, 27 de septiembre de 2018, 17:37
 
ace2<-filter(comer1, Gerencia=="gerente",Entidad=="Todo",Ejecutivo=="ejecutivo")
unique(ace2[,10])
avst18=ace2%>%mutate(
  Avance_VS_Target2018 = sprintf("%.1f%%",100*(Avance_2018 / Target_2018)),
  Avance_VS_Pautado2017= sprintf("%.1f%%",100*Avance_2018 / Pautado_2017
  ))
avst18[is.nan(avst18)]<-0
acef<-select(avst18,CUM_APAC,Target_2018,Avance_2018,Pautado_2017,Avance_VS_Target2018,Avance_VS_Pautado2017)
arrange(acef,desc(Pautado_2017),desc(Avance_2018),desc(Target_2018))


Ejemplos de cómo se ve la salida



Salida código NaN/ Inf


Cuando extrae las columnas los datos x/0 o 0/0 son los que quiero cambiar por cero.

Intentaré tomar replicar la alternativa que me das, mil gracias por tu ayuda.



Imagen de Manuel Muñoz Márquez
Re: Sustitución de NaN e Inf
de Manuel Muñoz Márquez - viernes, 28 de septiembre de 2018, 12:33
 

Buenas Liliana:

La propuesta es reemplazar la línea

avst18[is.nan(avst18)]<-0
por

tmp <- avst18[, c('Avance_VS_Target2018')]
tmp[is.na(tmp)] <- 0
avst18[, c('Avance_VS_Target2018')] <- tmp
y lo mismo para la otra variable.

Un saludo.