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


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.