Исправление множественного предупреждения «неизвестный столбец»


172

У меня есть постоянное многократное предупреждение о «неизвестном столбце» для всех типов команд (например, str (x) для установки обновлений в пакеты), и я не уверен, как это отладить или исправить.

Предупреждение «неизвестный столбец» явно связано с переменной в tbl_df, которую я переименовал, но предупреждение появляется во всех видах команд, которые, по-видимому, не связаны с tbl_df (например, установка обновлений в пакете, str (x), где x - это просто символьный вектор).


11
Я понимаю, что вопрос расплывчатый, но так кажется проблема. Я даже могу напечатать ерунду (например, опечатку) и получить предупреждения. Я предполагаю, что это постоянно в самой среде IDE, как-нибудь?
ssp3nc3r

1
Можете ли вы опубликовать точную команду и вывод, который вы получите, пожалуйста?
конв

3
Да, последняя версия RStudio. Я очистил среду, перезапустил ее, и она начинает происходить, когда я загружаю объект TBL_DF. Кажется, я решил проблему, преобразовав ее в as.data.frame, закрыв все и перезагрузив фрейм данных. В дальнейшем я хотел бы понять две вещи: как избежать проблемы с использованием tbl_df и почему предупреждения, похоже, сохраняются в среде.
ssp3nc3r

1
Я получаю ту же ошибку. Является FACEBOOK.1ли столбец в одном из ваших data.frames и вызываете ли вы его df$FACEBOOK.1где-нибудь в вашем R-скрипте? Мое скромное предположение состоит в том, что это ошибка в tibbleпакете, представленном в версии 1.1: blog.rstudio.org/2016/07/05/tibble-1-1 . Вы tibbleявно загрузили?
dpprdan

5
Это происходит и со мной. Я могу воспроизвести шаблон на нескольких компьютерах, но предупреждение появляется на первый взгляд случайно после некоторых команд, например, библиотеки (Hmisc) или создания кадра данных с помощью dplyr. Предупреждения относятся к столбцам, которые я еще не сделал - я сделаю их позже в своем коде. Я перезагружал R и Rstudio несколько раз, и чистый код не помогает. Что это???
Нова

Ответы:


58

Это проблема со средством диагностики в RStudio (средство, которое показывает предупреждения и возможные ошибки в вашем коде). Он был частично зафиксирован на этом совершают в RStudio v1.1.103 или позже @ Kévin-ushey . Исправление является частичным, потому что предупреждения все еще появляются (хотя и с меньшей частотой). Об этой проблеме сообщалось в виде воспроизводимого примера по адресу https://github.com/rstudio/rstudio/issues/7372, и она была исправлена ​​в запросе на извлечение RStudio v1.4 (будет выпущен)

Доступно несколько обходных путей, выберите решение, которое вы предпочитаете:

  • Отключите диагностику кода для всех файлов в Предпочтения / Код / Диагностика

  • Отключите всю диагностику для определенного файла:

    Добавьте в начале открытого файла (ов):

     # !diagnostics off

    Затем сохраните файлы, и предупреждения должны перестать появляться.

  • Отключите диагностику для переменных, которые вызывают предупреждение

    Добавьте в начале открытого файла (ов):

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

    Затем сохраните файлы, и предупреждения должны перестать появляться.

Предупреждения появляются потому, что диагностический инструмент в RStudio анализирует исходный код для обнаружения ошибок, и когда он выполняет диагностические проверки, он обращается к столбцам в вашей таблице, которые не инициализированы, и выдает предупреждение, которое мы видим. Предупреждения не появляются, потому что вы запускаете несвязанные вещи, они появляются, когда выполняется диагностика RStudio (когда файл сохраняется, затем изменяется, когда вы что-то запускаете ...).


13
хороший звонок. Это сработало для меня в RStudio 0.99, снимите флажок «показать диагностику для r» в разделе «Инструменты> Глобальные параметры> Код> Диагностика»
Крис Холбрук,

8
RStudio 1.1.383 с R 3.4.3, проблема все еще существует.
MS

4
Проблема все еще существует с версией 1.1.423. снятие отметки «показать диагностику» прекрасно работает
Адриан

2
Все еще существует v1.1.456. Вздох.
геоэтерия

3
Все еще существует RStudio v1.1.643 с R v3.5.1 на RStudio Server в Ubuntu.
RFelber

49

Я столкнулся с той же проблемой, и хотя я не знаю, почему это происходит, я смог определить, когда это происходит, и, таким образом, предотвратить это.

Похоже, проблема заключается в добавлении нового столбца, полученного из индексации, в базовый фрейм данных R по сравнению с фреймом данных Tibble. Возьмите этот пример, где вы добавляете новый столбец ( age) в базовый фрейм данных R:

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

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

Это работает без возврата предупреждения. Но когда то же самое делается с тиблом, он выдает предупреждение (и, следовательно, я думаю, что вызывает странную, на первый взгляд неспровоцированную проблему множественных предупреждений):

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' 

Конечно, есть лучшие способы избежать этого, но я обнаружил, что сначала создание вектора NAs делает свою работу:

tibble_df$age <- NA

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

13
Мой ответ явно не весь рассказ: я все еще получаю (несколько) предупреждений, и, как упоминали другие комментаторы, расстраивающая часть - это очевидный произвол. tbl_dfПредставляется необходимым для получения предупреждения, но я не уверен , что достаточно. То есть, я думаю, что это предупреждение может появиться, когда tbl_dfs используются вместе с функциями из других пакетов tidyverse (например, tidyr, dplyr). Небольшая цена за такой критический набор пакетов, но, тем не менее, странная / раздражающая.
сабля

Создание вектора NAсработало для меня! (RStudio версия 1.1.456, версия R 3.5.1)
Petzi

Иногда я хочу указать тип столбца, например, R Даты, и, если я укажу NA, даты, которые будут заполнены позже, будут преобразованы в числовой тип.
Jiāgěng

1
@ Jiāgěng as.Date(NA_character_)дает NAс классом Date.
Stibu

Tibbles по своему дизайну более строгие, чем data.frames. Это может быть преднамеренно, что вы не должны инициировать столбец, назначая ему только часть. Однако, если это защитная функция, а не ошибка проекта, тогда более ранняя одноразовая ошибка при назначении столбца будет намного предпочтительнее.
Винниф

17

Я столкнулся с этой проблемой при использовании пакета "dplyr".
Для тех, кто сталкивается с этой проблемой после использования функции «group_by» в библиотеке «dplyr»:

Я обнаружил, что разгруппировка переменных решает проблему предупреждения о неизвестных столбцах. Иногда мне приходилось повторять разгруппировку несколько раз, пока проблема не будет решена.


5

Преобразование класса в data.frameрешенную проблему для меня:

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"

Заимствовал частичный скрипт из @adts


Работает как часы. Мне было интересно, есть ли минус в том, чтобы преобразовать его во фрейм данных, а затем преобразовать обратно в таблицу. Это только предупреждения, которые он теряет?
p130ter

1
У меня не сработало RStudio 1.1.442 все еще получаетсяWarning message: Unknown or uninitialised column: 'bad_column'
andemexoax

3

У меня была эта проблема, когда я имел дело с функциями tibble и lapply вместе. Тибл, казалось, сохранял вещи как список внутри фрейма данных.

Я решил это с помощью unlist перед добавлением результатов функции lapply в таблицу.


1

Я тоже столкнулся с этой проблемой, кроме как из-за тиббла, созданного с помощью блока dyplyr. Вот небольшая модификация кода Сабре, чтобы показать, как я пришел к той же ошибке.

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

Допустим, я хотел выбрать следующие столбцы

best.columns = 'id'

Для меня следующее дало предупреждение:

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

Хотя это сработало, как и ожидалось, хотя, насколько я знаю dplyr, это должно быть идентично.

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

0

Я получаю эти предупреждения, когда переименовываю столбец, используя dplyr::renameпосле прочтения его с помощью readrпакета.

Старое имя столбца не переименовано в specатрибуте. Таким образом, удаление specатрибута устраняет предупреждения. Кроме того, удаление класса «spec_tbl_df» кажется хорошей идеей.

attr(dat, "spec") <- NULL
class(dat) <- setdiff(class(dat), "spec_tbl_df")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.