es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ajustando distribuciones de probabilidad de marco de datos con diferentes longitudes – EnvStat – bucle en R

Estoy tratando de ajustar distribuciones de probabilidad en R utilizando el paquete EnvStat y ejecutando un bucle para calcular varias columnas a la vez.
Las columnas tienen diferentes longitudes y está ocurriendo algún error en el código. El marco de datos no permanece en formato numérico.
Mensaje de error: ‘x’ debe ser un vector numérico.
No pude identificar el error. ¿Alguien podría ayudar?
Muchas gracias.

Sigue el código:

x = runif(n = 50, min = 1, max = 12)
y = runif(n = 70, min = 5, max = 15)
z = runif(n = 35, min = 1, max = 10)
m = runif(n = 80, min = 6, max = 18)
length(x) = length(m)
length(y) = length(m)
length(z) = length(m)
df = data.frame(x=x,y=y,z=z,m=m)
df
library(EnvStats)
nproc = 4
cont = 1
dfr = data.frame(variavel = character(nproc), 
                 locationevd= (nproc), scaleevd= (nproc),
                 stringsAsFactors = F)
i = 2
for (i in 1:4) {
print(i) 
nome.var=colnames(df)
df = df[,c(i)]
  df = na.omit(df)
variavela = nome.var[i]
  dfr$variavel[cont] = variavela
evd = eevd(df);evd
  locationevd = evd$parameters[[1]]
  dfr$locationevd[cont] = locationevd
  scaleevd = evd$parameters[[2]]
  dfr$scaleevd[cont] = scaleevd
cont = cont + 1
}
writexl::write_xlsx(dfr, path = "Results.xls")
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “x debe ser un vector numérico” indica que una de las columnas que se utiliza en el bucle no es un vector numérico. El código convierte cada columna del df en un vector y lo subconjunta para el bucle, pero no se verifica la clase del vector antes de utilizarlo.

    Para solucionar esto, puedes verificar si la columna es numérica antes de continuar con el bucle. Puedes hacer esto agregando una declaración if antes del código que subconjunta la columna y la convierte en un vector:

    for (i in 1:4) {
    
      print(i) 
    
      nome.var = colnames(df)
    
      if (is.numeric(df[, i])) {
        df_i = df[, c(i)]
        df_i = na.omit(df_i)
    
        variavela = nome.var[i]
        dfr$variavel[cont] = variavela
    
        evd = eevd(df_i)
        locationevd = evd$parameters[[1]]
        dfr$locationevd[cont] = locationevd
        scaleevd = evd$parameters[[2]]
        dfr$scaleevd[cont] = scaleevd
    
        cont = cont + 1
      } else {
        cat("La columna", nome.var[i], "no es numérica\n")
      }
    
    }
    

    Este código omitirá cualquier columna que no sea numérica e imprimirá un mensaje indicando qué columna se omitió.

Comments are closed.