Arreglando una "columna desconocida" de advertencia múltiple

171

Tengo una advertencia múltiple persistente de "columna desconocida" para todos los tipos de comandos (por ejemplo, str (x) para instalar actualizaciones en paquetes), y no estoy seguro de cómo depurar esto o solucionarlo.

La "columna desconocida" de advertencia está claramente relacionada con una variable en un tbl_df que renombré, pero la advertencia aparece en todo tipo de comandos que aparentemente no están relacionados con el tbl_df (por ejemplo, instalar actualizaciones en un paquete, str (x) donde x es simplemente un vector de caracteres).

ssp3nc3r
fuente
11
Me doy cuenta de que la pregunta es vaga, pero así parece el problema. Incluso puedo escribir sin sentido (por ejemplo, error tipográfico) y recibir las advertencias. Supongo que de alguna manera es persistente en el entorno IDE.
ssp3nc3r
1
¿Puedes publicar el comando exacto y la salida que obtienes por favor?
konvas
3
Sí, última versión de RStudio. Limpié el entorno, reinicié y comienza a ocurrir cuando cargo un objeto TBL_DF. Parece que he solucionado el problema convirtiéndolo en as.data.frame, cerrando todo y luego volviendo a cargar el marco de datos. En el futuro, me gustaría entender dos cosas: cómo evitar el problema usando tbl_df y por qué las advertencias parecen persistir en el entorno.
ssp3nc3r
1
Estoy teniendo el mismo error. ¿Hay FACEBOOK.1una columna en uno de sus data.frames y lo llama con df$FACEBOOK.1algún lugar en su script R? Mi humilde suposición es que este es un error en el tibblepaquete presentado en v1.1: blog.rstudio.org/2016/07/05/tibble-1-1 . ¿Has tibblecargado explícitamente?
dpprdan
55
Esto me está pasando a mí también. Puedo reproducir el patrón en varias computadoras, pero la advertencia aparece aparentemente al azar después de algunos comandos, por ejemplo, la biblioteca (Hmisc) o hacer un marco de datos con dplyr. Las advertencias se refieren a columnas que aún no he hecho; las hago más adelante en mi código. He reiniciado R y Rstudio varias veces y ejecutar el código limpio no ayuda. ¿¿¿Que es esto???
Nova

Respuestas:

58

Este es un problema con la herramienta de diagnóstico en RStudio (la herramienta que muestra advertencias y posibles errores en su código). Se solucionó parcialmente en este commit en RStudio v1.1.103 o posterior por @ kevin-ushey . La solución es parcial, porque las advertencias aún aparecen (aunque con menos frecuencia). Este problema se ha informado con un ejemplo reproducible en https://github.com/rstudio/rstudio/issues/7372 y se ha solucionado en la solicitud de extracción RStudio v1.4 (que se lanzará)

Hay varias soluciones disponibles, elija la solución que prefiera:

  • Deshabilite el diagnóstico de código para todos los archivos en Preferencias / Código / Diagnóstico

  • Deshabilite todos los diagnósticos para un archivo específico:

    Agregue al comienzo de los archivos abiertos:

     # !diagnostics off

    Luego guarde los archivos y las advertencias deberían dejar de aparecer.

  • Deshabilite los diagnósticos para las variables que causan la advertencia.

    Agregue al comienzo de los archivos abiertos:

     # !diagnostics suppress=<comma-separated list of variables>

    Luego guarde los archivos y las advertencias deberían dejar de aparecer.

Las advertencias aparecen porque la herramienta de diagnóstico en RStudio analiza el código fuente para detectar errores y cuando realiza las verificaciones de diagnóstico accede a columnas en su tibble que no están inicializadas, dando la Advertencia que vemos. Las advertencias no aparecen porque ejecuta cosas no relacionadas, aparecen cuando se ejecutan los diagnósticos de RStudio (cuando se guarda un archivo, luego se modifica, cuando ejecuta algo ...).

zeehio
fuente
13
buena llamada. Esto funcionó para mí en RStudio 0.99, desmarque 'mostrar diagnósticos para r' en Herramientas> Opciones globales> Código> Diagnóstico
Chris Holbrook
8
RStudio 1.1.383 con R 3.4.3, el problema aún existe.
MS Berends
44
El problema aún existe con la versión 1.1.423. desmarcar 'show diagnostics' funciona muy bien
Adrian
2
Todavía existe v1.1.456. Suspiro.
geotheory
3
Sill existe RStudio v1.1.643 con R v3.5.1 en RStudio Server en Ubuntu.
RFelber
49

He estado encontrando el mismo problema, y ​​aunque no sé por qué ocurre, he podido precisar cuándo ocurre, y así evitar que suceda.

El problema parece ser la adición de una nueva columna, derivada de la indexación, en un marco de datos base R frente a un marco de datos tibble. Tome este ejemplo, donde agrega una nueva columna ( age) a un marco de datos base R:

base_df <- data.frame(id = c(1:3), name = c("mary", "jill","steve"))

base_df$age[base_df$name == "mary"] <- 47

Eso funciona sin devolver una advertencia. Pero cuando se hace lo mismo con un tibble, arroja una advertencia (y, en consecuencia, creo que causa el extraño, aparentemente no provocado, problema de advertencia múltiple):

library(tibble)

tibble_df <- tibble(id = c(1:3), name = c("mary", "jill","steve"))

tibble_df$age[tibble_df$name == "mary"] <- 47

Warning message:
Unknown column 'age' 

Seguramente hay mejores maneras de evitar esto, pero he descubierto que crear un vector de NAs hace el trabajo:

tibble_df$age <- NA

tibble_df$age[tibble_df$name == "mary"] <- 47
sable
fuente
13
Mi respuesta claramente no es toda la historia: todavía estoy recibiendo las advertencias (múltiples) y, como otros comentadores aludieron, la parte frustrante es la aparente arbitrariedad de la misma. A tbl_dfparece ser necesario para producir las advertencias, pero no estoy seguro de que sea suficiente. Es decir, creo que esta advertencia podría surgir cuando tbl_dfse usan s junto con funciones de otros paquetes tidyverse (por ejemplo, tidyr, dplyr). Pequeño precio a pagar por un paquete tan crítico de paquetes, pero no obstante extraño / molesto.
saber
¡Crear un vector de NAs funcionó para mí! (RStudio Versión 1.1.456, R versión 3.5.1)
petzi
A veces quiero especificar el tipo de columna, p. Ej., Fechas R, y si relleno NA, las fechas que se completan más tarde se convertirán al tipo numérico.
Jiāgěng
1
@ Jiāgěng as.Date(NA_character_)da NAcon clase Date.
Stibu
Los tibbles son por diseño más restrictivos que data.frames. Puede ser por diseño, que no se supone que inicie una columna asignándole solo una parte. Sin embargo, si esta es una característica de protección y no un error de diseño, sería preferible un error temprano de una sola vez en la asignación de tibble.
vinnief
17

Me he enfrentado a este problema al usar el paquete "dplyr".
Para aquellos que enfrentan este problema después de usar la función "group_by" en la biblioteca "dplyr":

Descubrí que desagrupar las variables resuelve el problema de advertencia de columna desconocida. A veces he tenido que repetir la desagrupación varias veces hasta que se resuelve el problema.

Varun
fuente
5

Convertir la clase en data.frameresuelto el problema para mí:

library(dplyr)
df <- data.frame(id = c(1,1:3), name = c("mary", "jo", "jill","steve"))
dfTbl <- df %>%
  group_by(id) %>%
  summarize (n = n())
class(dfTbl) # [1] "tbl_df"     "tbl"        "data.frame"
dfTbl = as.data.frame(dfTbl)
class(dfTbl) # [1] "data.frame"

Tomó prestado el script parcial de @adts

Stok
fuente
funciona a las mil maravillas. Me preguntaba si hay algún inconveniente en convertirlo en un marco de datos y luego convertirlo nuevamente en tibble. ¿Son solo las advertencias que pierde?
p130ter
1
No funcionó para mí RStudio 1.1.442 sigue obteniendoWarning message: Unknown or uninitialised column: 'bad_column'
andemexoax 05 de
3

Tuve este problema al tratar las funciones tibble y lapply juntas. El tibble parecía guardar cosas como una lista dentro del marco de datos.

Lo resolví usando unlist antes de agregar los resultados de una función de lapply al tibble.

michael joseph
fuente
1

También me encontré con este problema, excepto a través de un tibble creado con un bloque dyplyr. Aquí hay una ligera modificación del código de sabre para mostrar cómo llegué al mismo error.

library(dplyr)

df <- data.frame(id = c(1,1:3), name = c("mary", "jo", "jill","steve"))

t <- df %>%
  group_by(id) %>%
  summarize (n = n())

t
str(t)


t$newvar[t$id==1] <- 0
adts
fuente
1

Digamos que quería seleccionar las siguientes columnas.

best.columns = 'id'

Para mí lo siguiente dio la advertencia:

df%>% select_(one_of(best.columns))

Si bien esto funcionó como se esperaba, aunque, hasta donde yo sé dplyr, esto debería ser idéntico.

df%>% select_(.dots = best.columns)
JelenaČuklina
fuente
0

Recibo estas advertencias cuando cambio el nombre de una columna usando dplyr::renamedespués de leerla usando el readrpaquete.

El nombre antiguo de la columna no se renombra en el specatributo. Entonces, eliminar el specatributo hace que las advertencias desaparezcan. También eliminar la clase "spec_tbl_df" parece una buena idea.

attr(dat, "spec") <- NULL
class(dat) <- setdiff(class(dat), "spec_tbl_df")
alko989
fuente