1 votos

Hacer que R reporte un error al usar un nombre de columna inexistente en un marco de datos

En nuestro uso de R para un proyecto no trivial de análisis y estimación de datos, nos hemos quemado repetidamente por lo tolerante que es R hacia las columnas mal escritas o que faltan en un marco de datos. Un ejemplo típico es el cálculo de la media ponderada de una variable MYVAR en un marco de datos utilizando otra variable PESO para las ponderaciones:

m <- weighted.mean(tbl$MYVAR, w = tbl$WEIGHT, na.rm = TRUE)

Supongamos que cometo un error tipográfico en el nombre PESO en la operación anterior. Lo que ocurrirá en que R expandirá mi columna mal escrita a NULL y la utilizará para realizar la media ponderada dando como resultado una no ponderada.

Por lo tanto, la pregunta: ¿hay alguna manera de hacer que R trate los intentos de "leer" una variable inexistente en un marco de datos como un error?

3voto

Dillie-O Puntos 16780

Hmm... cuando probé tu ejemplo con algunos datos falsos, weighted.mean() en realidad, falló:

#Some fake data
dat <- data.frame(x = rnorm(100), weight = rnorm(100))

#The right weight var
weighted.mean(x = dat$x, w = dat$weight)
[1] 0.6161606

#Misspelled weight var
weighted.mean(x = dat$x, w = dat$wieght)
Error in weighted.mean.default(x = dat$x, w = dat$wieght) : 
  'x' and 'w' must have the same length

Pero de todos modos, otra manera de lidiar con este problema es acceder a sus variables a través de la indexación - devuelve un error si se trata de elegir columnas inexistentes:

dat$wieght
NULL

dat[ , "wieght"]
Error in `[.data.frame`(dat, , "wieght") : undefined columns selected

weighted.mean(x = dat[ , "x"], w = dat[ , "wieght"], na.rm = TRUE)
Error in `[.data.frame`(dat, , "wieght") : undefined columns selected

1voto

DavLink Puntos 101

Tal vez, puedes encerrar tu código en bloques try-catch, ver ?try y los ejemplos asociados. Es fácil comprobar la clase de los resultados ("try-error") a su vez, por ejemplo

> res <- try(log("A"), silent=TRUE)
> class(res)
[1] "try-error"

También puede comprobar directamente la ortografía correcta, enumerando primero las variables de interés, en su caso, MYVAR y WEIGHT -- y comprobar que forman parte del data.frame df Por ejemplo

df <- data.frame(x=rnorm(100), g1=gl(2, 50), g2=gl(5,20))
sel.vars <- c("x","g2")
ifelse(all(sel.vars %in% colnames(df)), <compute things here>, "fail")

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X