修复了多个警告“未知列”


169

对于所有类型的命令(例如,在软件包上安装更新的str(x)),我都会持续发出“未知列”的多次警告,并且不确定如何调试或修复它。

警告“未知列”显然与我重命名的tbl_df中的变量有关,但是警告似乎出现在与tbl_df不相关的所有命令中(例如,在x为x的软件包str(x)上安装更新)只是一个字符向量)。


11
我知道问题很模糊,但问题似乎如此。我什至可以输入废话(例如拼写错误)并接收警告。我猜想它在IDE环境中是持久的,以某种方式?
ssp3nc3r

1
您可以张贴确切的命令和您得到的输出吗?
konvas '16

3
是的,最新版本的RStudio。我清理了环境,然后重新启动,并在加载TBL_DF对象时开始发生。我似乎已通过将其转换为as.data.frame,关闭所有内容,然后重新加载数据帧来解决此问题。展望未来,我想了解两件事:如何使用tbl_df避免问题以及为什么警告似乎在环境中仍然存在。
ssp3nc3r

1
我遇到了同样的错误。FACEBOOK.1您的data.frames之一中是否存在一列,您是否df$FACEBOOK.1在R脚本中的某处调用它?我谦虚的猜测是,这是tibblev1.1中引入的软件包中的错误:blog.rstudio.org/2016/07/05/tibble-1-1。您是否已tibble明确加载?
dpprdan

5
这也在我身上发生。我可以在多台计算机上重现该模式,但是在某些命令(例如,library(Hmisc)或使用dplyr创建数据框)之后,警告似乎随机出现。警告指的是我尚未创建的列-我稍后将在我的代码中创建它们。我已经多次重新启动R和Rstudio,干净运行代码无济于事。这是什么???
新星

Answers:


57

这是RStudio中的“诊断”工具(该工具在代码中显示警告和可能的错误)的问题。@ kevin-ushey在RStudio v1.1.103或更高版本中对此提交进行了部分修复。该修复程序是不完整的,因为警告仍然出现(尽管出现的次数较少)。已在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的诊断”
Chris Holbrook

8
RStudio 1.1.383和R 3.4.3,问题仍然存在。
MS Berends '17

4
版本1.1.423仍然存在问题。取消选中“显示诊断”效果很好
Adrian

2
仍然存在v1.1.456。叹。
geotheory,

3
Sill在Ubuntu的RStudio服务器上存在RStudio v1.1.643和R v3.5.1。
RFelber

49

我一直遇到相同的问题,尽管我不知道为什么会发生,但我能够确定何时发生,从而防止了它的发生。

问题似乎在于在基础R数据帧与小标题数据帧中添加从索引派生的新列。以这个示例为例,您将一个新列(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)中的函数结合使用时,可能会出现此警告。这样的关键套件价格很小,但是却很奇怪/令人讨厌。
佩剑

创建NAs 的向量对我有用!(RStudio版本1.1.456,R版本3.5.1)
petzi

有时我想指定列的类型,例如R Dates,如果我填写NA,以后填写的日期将转换为数字类型。
贾金,

1
@嘉庚as.Date(NA_character_)NA带班Date
Stibu

通过设计,小标题比data.frames更具限制性。可能是设计使然,您不应仅通过分配一部分来初始化该列。但是,如果这是一种保护功能,而不是设计错误,则在小巧的分配中尽早出现一次错误将是可取的。
vinnief

17

使用“ dplyr”软件包时,我已经遇到了这个问题。
对于在“ dplyr”库中使用“ group_by”函数后面临此问题的用户:

我发现取消分组变量可以解决未知列警告问题。有时,我不得不反复进行几次取消分组的操作,直到问题解决为止。


4

将类转换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

一起处理小标题和lapply函数时遇到了这个问题。这个小问题似乎将事物保存为数据框内的列表。

我在添加小贴士函数的结果之前使用unlist解决了该问题。


1

除了通过使用dyplyr块创建的小标题之外,我也遇到了这个问题。这是对sabre代码的略微修改,以显示我如何遇到相同的错误。

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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.