Naprawianie wielokrotnego ostrzeżenia „nieznana kolumna”


171

Mam ciągłe wielokrotne ostrzeżenie o „nieznanej kolumnie” dla wszystkich typów poleceń (np. Str (x) do instalowania aktualizacji na pakietach) i nie wiem, jak to debugować lub naprawić.

Ostrzeżenie „nieznana kolumna” jest wyraźnie powiązane ze zmienną w tbl_df, której nazwę zmieniłem, ale ostrzeżenie pojawia się we wszystkich rodzajach poleceń pozornie niezwiązanych z tbl_df (np. Instalowanie aktualizacji w pakiecie, str (x), gdzie x to po prostu wektor znakowy).


11
Zdaję sobie sprawę, że pytanie jest niejasne, ale wydaje się, że problem. Mogę nawet wpisywać bzdury (np. Literówka) i otrzymywać ostrzeżenia. Zgaduję, że jakoś jest trwały w samym środowisku IDE?
ssp3nc3r

1
Czy możesz opublikować dokładne polecenie i wyniki, które otrzymasz?
konvas

3
Tak, najnowsza wersja RStudio. Wyczyściłem środowisko, zrestartowałem i zaczyna się to pojawiać, gdy ładuję obiekt TBL_DF. Wydaje się, że rozwiązałem problem, konwertując go do as.data.frame, zamykając wszystko, a następnie ponownie ładując ramkę danych. Idąc dalej, chciałbym zrozumieć dwie rzeczy: jak uniknąć problemu przy użyciu tbl_df i dlaczego ostrzeżenia wydają się nadal występować w środowisku.
ssp3nc3r

1
Otrzymuję ten sam błąd. Czy FACEBOOK.1kolumna jest w jednym z twoich data.frames i czy wywołujesz ją df$FACEBOOK.1gdzieś w skrypcie R? Domyślam się, że jest to błąd w tibblepakiecie wprowadzonym w wersji 1.1: blog.rstudio.org/2016/07/05/tibble-1-1 . Czy tibblewyraźnie załadowałeś?
dpprdan

5
Mnie też się to przytrafia. Mogę odtworzyć wzór na wielu komputerach, ale ostrzeżenie pojawia się pozornie losowo po niektórych poleceniach, na przykład biblioteka (Hmisc) lub tworzenie ramki danych za pomocą dplyr. Ostrzeżenia dotyczą kolumn, których jeszcze nie utworzyłem - robię je później w kodzie. Wielokrotnie restartowałem R i Rstudio i uruchomienie czystego kodu nie pomaga. Co to jest???
Nova,

Odpowiedzi:


58

Jest to problem z narzędziem diagnostycznym w RStudio (narzędziu wyświetlającym ostrzeżenia i możliwe błędy w kodzie). Zostało to częściowo naprawione w tym zatwierdzeniu w RStudio v1.1.103 lub nowszym przez @ kevin-ushey . Poprawka jest częściowa, ponieważ ostrzeżenia nadal się pojawiają (choć z mniejszą częstotliwością). Ten problem został zgłoszony za pomocą odtwarzalnego przykładu pod adresem https://github.com/rstudio/rstudio/issues/7372 i został rozwiązany w żądaniu ściągnięcia RStudio v1.4 (do wydania)

Dostępnych jest kilka obejść, wybierz preferowane rozwiązanie:

  • Wyłącz diagnostykę kodu dla wszystkich plików w Preferencjach / Kod / Diagnostyka

  • Wyłącz całą diagnostykę określonego pliku:

    Dodaj na początku otwieranych plików:

     # !diagnostics off

    Następnie zapisz pliki, a ostrzeżenia powinny przestać się pojawiać.

  • Wyłącz diagnostykę zmiennych, które powodują ostrzeżenie

    Dodaj na początku otwieranych plików:

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

    Następnie zapisz pliki, a ostrzeżenia powinny przestać się pojawiać.

Ostrzeżenia pojawiają się, ponieważ narzędzie diagnostyczne w RStudio analizuje kod źródłowy w celu wykrycia błędów, a gdy przeprowadza testy diagnostyczne, uzyskuje dostęp do kolumn w tibble, które nie zostały zainicjowane, dając ostrzeżenie, które widzimy. Ostrzeżenia nie pojawiają się, ponieważ uruchamiasz niepowiązane rzeczy, pojawiają się one podczas wykonywania diagnostyki RStudio (gdy plik jest zapisywany, a następnie modyfikowany, gdy coś uruchamiasz ...).


13
dobra decyzja. To zadziałało dla mnie w RStudio 0.99, odznacz 'pokaż diagnostykę dla r' w Narzędziach> Opcje globalne> Kod> Diagnostyka
Chris Holbrook

8
RStudio 1.1.383 z R 3.4.3, problem nadal istnieje.
MS Berends

4
Nadal występuje problem z wersją 1.1.423. odznaczenie opcji „pokaż diagnostykę” działa świetnie
Adrian

2
Nadal istnieje wersja 1.1.456. Westchnienie.
geoteoria

3
Sill istnieje RStudio v1.1.643 z R v3.5.1 na serwerze RStudio na Ubuntu.
RFelber,

49

Napotkałem ten sam problem i chociaż nie wiem, dlaczego się pojawia, byłem w stanie określić, kiedy się pojawia, a tym samym zapobiec temu.

Wydaje się, że problem polega na dodaniu nowej kolumny, pochodzącej z indeksowania, w podstawowej ramce danych R w porównaniu z ramką danych tibble. Weźmy ten przykład, w którym dodajesz nową kolumnę ( age) do podstawowej ramki danych R:

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

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

Działa bez zwracania ostrzeżenia. Ale kiedy to samo zostanie zrobione z tibble, generuje ostrzeżenie (i w konsekwencji, myślę, że powoduje dziwny, pozornie niesprowokowany, wielokrotny problem z ostrzeżeniem):

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' 

Z pewnością istnieją lepsze sposoby na uniknięcie tego, ale odkryłem, że pierwsze utworzenie wektora NAs działa:

tibble_df$age <- NA

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

13
Moja odpowiedź z pewnością nie jest całą historią: wciąż otrzymuję (wielokrotne) ostrzeżenia i, jak wspominali inni komentatorzy, frustrującą częścią jest pozorna arbitralność. tbl_dfWydaje się być konieczne do produkcji ostrzeżenia, ale nie jestem pewien, że to wystarczy. To znaczy, myślę, że to ostrzeżenie może pojawić się, gdy tbl_dfs używane są w połączeniu z funkcjami z innych pakietów tidyverse (np. Tidyr, dplyr). Niewielka cena za tak krytyczny pakiet pakietów, ale mimo to dziwna / irytująca.
szabla

Stworzenie wektora NAs zadziałało! (RStudio wersja 1.1.456, R wersja 3.5.1)
petzi

Czasem chcę określić typ kolumny, np. R Daty, a jeśli wypełnię NA, daty wypełnione później zostaną przekonwertowane na typ liczbowy.
Jiāgěng

1
@ Jiāgěng as.Date(NA_character_)daje NAz klasą Date.
Stibu

Tibble są z założenia bardziej restrykcyjne niż data.frames. Być może zgodnie z projektem nie powinieneś inicjować kolumny, przypisując do niej tylko część. Jeśli jednak jest to funkcja ochronna, a nie błąd projektowy, o wiele korzystniejszy byłby wczesny jednorazowy błąd w przypisaniu tibble.
vinnief

17

Napotkałem ten problem podczas korzystania z pakietu „dplyr”.
Osoby, które mają do czynienia z tym problemem po użyciu funkcji „group_by” w bibliotece „dplyr”:

Odkryłem, że rozgrupowanie zmiennych rozwiązuje problem z ostrzeżeniem o nieznanej kolumnie. Czasami musiałem kilka razy powtarzać rozgrupowanie, aż problem zostanie rozwiązany.


5

Przekształcenie klasy w data.framerozwiązany problem dla mnie:

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"

Wypożyczono częściowy skrypt z @adts


To działa jak urok. Zastanawiałem się, czy konwertowanie go na ramkę danych, a następnie konwertowanie z powrotem na tibble ma jakieś wady. Czy to tylko ostrzeżenia, które traci?
p130,

1
Nie działa dla mnie RStudio 1.1.442 nadal się Warning message: Unknown or uninitialised column: 'bad_column'
pobiera

3

Miałem ten problem, gdy miałem do czynienia z funkcjami tibble i lapply. Wydawało się, że tibble zapisuje elementy jako listę wewnątrz ramki danych.

Rozwiązałem to, używając unlist przed dodaniem wyników funkcji lapply do tibble.


1

Natknąłem się również na ten problem, z wyjątkiem tibble utworzonego za pomocą bloku dyplyra. Oto niewielka modyfikacja kodu Sabre, aby pokazać, jak doszedłem do tego samego błędu.

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

Powiedzmy, że chciałem wybrać następujące kolumny

best.columns = 'id'

Dla mnie następujące ostrzeżenie dało:

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

Chociaż działało to zgodnie z oczekiwaniami, chociaż, o ile wiem dplyr, powinno być identyczne.

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

0

Otrzymuję te ostrzeżenia, gdy zmieniam nazwę kolumny przy użyciu dplyr::renamepo przeczytaniu jej przy użyciureadr pakietu.

Stara nazwa kolumny nie została zmieniona w specatrybucie. Usunięcie specatrybutu sprawia, że ​​ostrzeżenia znikają. Usunięcie klasy „spec_tbl_df” wydaje się dobrym pomysłem.

attr(dat, "spec") <- NULL
class(dat) <- setdiff(class(dat), "spec_tbl_df")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.