Correzione di un avviso multiplo "colonna sconosciuta"


170

Ho un persistente avviso multiplo di "colonna sconosciuta" per tutti i tipi di comandi (ad esempio, str (x) per l'installazione di aggiornamenti sui pacchetti) e non sono sicuro di come eseguire il debug di questo o risolverlo.

L'avvertimento "colonna sconosciuta" è chiaramente correlato a una variabile in un tbl_df che ho rinominato, ma l'avviso compare in tutti i tipi di comandi apparentemente non correlati al tbl_df (ad esempio, l'installazione di aggiornamenti su un pacchetto, str (x) dove x è semplicemente un carattere vettoriale).


11
Mi rendo conto che la domanda è vaga, ma così sembra il problema. Posso persino scrivere assurdità (es. Errore di battitura) e ricevere gli avvisi. Immagino che sia persistente nell'ambiente IDE stesso, in qualche modo?
ssp3nc3r

1
Puoi pubblicare il comando esatto e l'output che ottieni per favore?
konvas,

3
Sì, ultima versione di RStudio. Ho pulito l'ambiente, riavviato e inizia a verificarsi quando carico un oggetto TBL_DF. Mi sembra di aver risolto il problema convertendolo in as.data.frame, chiudendo tutto e ricaricando il frame di dati. In futuro, vorrei capire due cose: come evitare il problema utilizzando tbl_df e perché gli avvisi sembrano persistere nell'ambiente.
ssp3nc3r,

1
Ricevo lo stesso errore. È FACEBOOK.1una colonna in uno dei tuoi data.frames e la chiami da df$FACEBOOK.1qualche parte nel tuo script R? La mia modesta ipotesi è che questo è un errore nel tibblepacchetto introdotto in v1.1: blog.rstudio.org/2016/07/05/tibble-1-1 . Hai tibblecaricato esplicitamente?
dpprdan,

5
Questo sta succedendo anche a me. Posso riprodurre il modello su più computer ma l'avviso appare apparentemente in modo casuale dopo alcuni comandi, ad esempio library (Hmisc) o creando un frame di dati con dplyr. Gli avvisi si riferiscono a colonne che non ho ancora creato - le creo più avanti nel mio codice. Ho riavviato R e Rstudio più volte e l'esecuzione del codice pulito non aiuta. Cos'è questo???
Nova,

Risposte:


57

Questo è un problema con lo strumento di diagnostica in RStudio (lo strumento che mostra avvisi e possibili errori nel codice). È stato parzialmente corretto a questo commit in RStudio v1.1.103 o successivo da @ kevin-ushey . La correzione è parziale, perché gli avvisi vengono comunque visualizzati (sebbene con meno frequenza). Questo problema è stato segnalato con un esempio riproducibile su https://github.com/rstudio/rstudio/issues/7372 ed è stato risolto sulla richiesta pull di RStudio v1.4 (da rilasciare)

Sono disponibili diverse soluzioni alternative, scegli la soluzione che preferisci:

  • Disabilita la diagnostica del codice per tutti i file in Preferenze / Codice / Diagnostica

  • Disabilita tutta la diagnostica per un file specifico:

    Aggiungi all'inizio dei file aperti:

     # !diagnostics off

    Quindi salva i file e gli avvisi dovrebbero smettere di apparire.

  • Disabilita la diagnostica per le variabili che causano l'avviso

    Aggiungi all'inizio dei file aperti:

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

    Quindi salva i file e gli avvisi dovrebbero smettere di apparire.

Gli avvisi vengono visualizzati perché lo strumento di diagnostica in RStudio analizza il codice sorgente per rilevare gli errori e quando esegue i controlli diagnostici accede alle colonne del tuo tibble che non sono inizializzate, dando l'avvertimento che vediamo. Gli avvisi non vengono visualizzati perché si eseguono cose non correlate, vengono visualizzati quando viene eseguita la diagnostica RStudio (quando un file viene salvato, quindi modificato, quando si esegue qualcosa ...).


13
Ottima scelta. Questo ha funzionato per me in RStudio 0.99, deseleziona 'mostra diagnostica per r' in Strumenti> Opzioni globali> Codice> Diagnostica
Chris Holbrook

8
RStudio 1.1.383 con R 3.4.3, il problema persiste.
MS Berends

4
Il problema persiste con la versione 1.1.423. deselezionando 'Mostra diagnostica' funziona alla grande
Adrian

2
Esiste ancora v1.1.456. Sospiro.
geotheory,

3
Sill esiste RStudio v1.1.643 con R v3.5.1 su RStudio Server su Ubuntu.
RFelber,

49

Ho riscontrato lo stesso problema e, anche se non so perché si verifichi, sono stato in grado di individuare quando si verifica e quindi impedire che ciò accada.

Il problema sembra riguardare l'aggiunta in una nuova colonna, derivata dall'indicizzazione, in un frame di dati R di base anziché in un frame di dati tibble. Prendi questo esempio, in cui aggiungi una nuova colonna ( age) a un frame di dati R di base:

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

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

Funziona senza restituire un avviso. Ma quando lo stesso viene fatto con un tibble, viene emesso un avviso (e, di conseguenza, penso che causi lo strano problema di avviso multiplo, apparentemente non provocato):

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' 

Ci sono sicuramente modi migliori per evitarlo, ma ho scoperto che per prima cosa creare un vettore di NAs fa il lavoro:

tibble_df$age <- NA

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

13
La mia risposta non è chiaramente l'intera storia: sto ancora ricevendo gli (multipli) avvertimenti, e come altri commentatori hanno accennato, la parte frustrante è l' apparente arbitrarietà di esso. A tbl_dfsembra necessario per produrre gli avvertimenti, ma non sono sicuro che sia sufficiente. Cioè, penso che questo avvertimento potrebbe emergere quando tbl_dfs sono usati insieme a funzioni di altri pacchetti ordinati (es. Tidyr, dplyr). Piccolo prezzo da pagare per una suite così critica di pacchetti, ma comunque strano / fastidioso.
Sciabola,

Creare un vettore di NAs ha funzionato per me! (RStudio versione 1.1.456, R versione 3.5.1)
petzi

A volte desidero specificare il tipo di colonna, ad es. Date R, e se compilo NA, le date che vengono riempite in seguito verranno convertite nel tipo numerico.
Jiāgěng,

1
@ Jiāgěng as.Date(NA_character_)NAcon classe Date.
Stibu,

I Tibble sono di progettazione più restrittivi di data.frames. È possibile che non sia necessario avviare una colonna assegnandone solo una parte. Tuttavia, se si tratta di una caratteristica di protezione e non di un errore di progettazione, sarebbe preferibile un primo errore una tantum nell'assegnazione delle variabili.
vinnief

17

Ho riscontrato questo problema durante l'utilizzo del pacchetto "dplyr".
Per coloro che affrontano questo problema dopo aver utilizzato la funzione "group_by" nella libreria "dplyr":

Ho scoperto che il raggruppamento delle variabili risolve il problema di avviso della colonna sconosciuta. A volte ho dovuto scorrere più volte il raggruppamento fino a quando il problema non è stato risolto.


4

La conversione della classe in data.framerisolto il problema per me:

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"

Preso in prestito lo script parziale da @adts


Esso funziona magicamente. Mi chiedevo se ci fosse qualche svantaggio nel convertirlo in un frame di dati e nel riconvertirlo in tibble. Sono solo gli avvertimenti che perde?
p130ter

1
RStudio 1.1.442 non funzionava ancora per meWarning message: Unknown or uninitialised column: 'bad_column'
andemexoax

3

Ho avuto questo problema quando ho affrontato insieme le funzioni tibble e lapply. Il tibble sembrava salvare le cose come un elenco all'interno del frame di dati.

L'ho risolto usando unlist prima di aggiungere i risultati di una funzione lapply alla tabella.


1

Mi sono imbattuto anche in questo problema tranne che attraverso una tabella creata usando un blocco dyplyr. Ecco una leggera modifica del codice di Sabre per mostrare come sono arrivato allo stesso errore.

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

1

Diciamo che volevo selezionare le seguenti colonne

best.columns = 'id'

Per me quanto segue ha dato l'avvertimento:

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

Mentre questo ha funzionato come previsto, anche se, per quanto ne so dplyr, dovrebbe essere identico.

df%>% select_(.dots = best.columns)

0

Ricevo questi avvisi quando rinomino una colonna usando dplyr::renamedopo averla letta usando il readrpacchetto.

Il vecchio nome della colonna non viene rinominato specnell'attributo. Quindi la rimozione specdell'attributo fa scomparire gli avvisi. Anche la rimozione della classe "spec_tbl_df" sembra una buona idea.

attr(dat, "spec") <- NULL
class(dat) <- setdiff(class(dat), "spec_tbl_df")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.