修复多个警告“未知列”问题

200

我一直遇到"未知列"的持续性多个警告,无论是什么类型的命令(例如str(x)安装更新程序包),都不确定如何调试或修复它。

"未知列"警告明显与我重命名的tbl_df中的变量有关,但警告出现在所有种类的命令中,似乎与tbl_df无关(例如在一个简单的字符向量x上执行安装更新文件包,str(x)等命令)。


11
我明白这个问题相当模糊,而它所引起的问题也同样如此。我甚至可以打一些无意义的文字(例如,打错字),并且还是能收到警告。我猜想这是与IDE环境本身有关吧? - ssp3nc3r
1
你能否发布一下确切的命令和输出结果吗? - konvas
3
是的,最新版本的RStudio。我清空了环境,重新启动后,当我加载TBL_DF对象时就开始出现这个问题。通过将其转换为as.data.frame,关闭一切然后重新加载数据框似乎已经解决了这个问题。今后,我想了解两件事:如何避免使用tbl_df出现这个问题以及为什么警告似乎在环境中持续存在。 - ssp3nc3r
5
我也遇到了这个问题。我可以在多台电脑上重现这个模式,但警告似乎是随机出现的,在执行某些命令后会出现,例如library(Hmisc)或使用dplyr创建数据框。警告涉及我尚未创建的列 - 我稍后在代码中创建它们。我已经多次重新启动了R和Rstudio,并且运行干净的代码也没有帮助。这是怎么回事? - Nova
1
今天我同时更新了R(到3.3.2)和R Studio(到1.0.136)。从那时起,我也收到了这些警告。以前我使用的是R 2.2.5和一个版本的R Studio,在R 2.2.5发布时是最新的(对于这里的不明确性表示抱歉)。 - yoland
显示剩余11条评论
10个回答

70
这是RStudio诊断工具的问题(该工具显示代码中的警告和可能的错误)。在RStudio v1.1.103或更高版本中,@kevin-ushey部分修复了此问题,commit。该修复是部分的,因为警告仍然会出现(尽管出现频率较低)。此问题已在https://github.com/rstudio/rstudio/issues/7372上报告,并在RStudio v1.4 pull request上得到解决。
更新到最新的RStudio版本以解决此问题。或者,有几种可用的解决方法,选择您喜欢的解决方案:
  • Disable the code diagnostics for all files in Preferences/Code/Diagnostics

  • Disable all diagnostics for a specific file:

    Add at the beginning of the opened file(s):

     # !diagnostics off
    

    Then save the files and the warnings should stop appearing.

  • Disable the diagnostics for the variables that cause the warning

    Add at the beginning of the opened file(s):

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

    Then save the files and the warnings should stop appearing.

警告出现是因为RStudio的诊断工具解析源代码以检测错误,当它执行诊断检查时,访问未初始化的tibble列,从而产生我们看到的警告。这些警告不是因为你运行了无关的东西而出现的,它们出现在RStudio诊断程序执行时(当文件被保存、修改或运行时...)。

16
好的建议。在RStudio 0.99中,通过“工具”>“全局选项”>“代码”>“诊断”取消选中“显示R的诊断信息”,对我很有效。 - Chris Holbrook
9
RStudio 1.1.383 配合 R 3.4.3,问题仍然存在。 - MS Berends
4
版本1.1.423仍存在问题。取消选中“显示诊断”可以解决该问题。 - Adrian
2
仍然存在v1.1.456。唉。 - geotheory
3
仍然可以在Ubuntu上的RStudio Server上运行带有R v3.5.1的RStudio v1.1.643。 - RFelber
显示剩余14条评论

62

我一直遇到同样的问题,虽然我不知道为什么会发生,但我已经能够确定它发生的时间,并防止其发生。

问题似乎出在在基础R数据框或tibble数据框中添加新的索引派生列时。以这个例子为例,您向基础 R 数据框添加一个新列(age):

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

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

这在不返回警告的情况下可以工作。但是,当使用tibble进行相同操作时,它会引发警告(因此,我认为导致了奇怪的,看似无端的多个警告问题):

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' 

避免这种情况的方法肯定有更好的,但我发现首先创建一个NA向量就能做到:

tibble_df$age <- NA

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

14
我的回答显然不是全部的故事:我仍然收到(多个)警告,并且正如其他评论者所暗示的,令人沮丧的部分是 表面上 的任意性。tbl_df似乎是产生这些警告的必要条件,但我不确定它是否足够。也就是说,我认为当 tbl_df 与其他tidyverse包中的函数一起使用(例如tidyr,dplyr)时,可能会出现此警告。为这样一个关键的套件付出小代价是值得的,但仍然很奇怪/烦人。 - sabre
创建一个由 NA 组成的向量对我很有用!(RStudio 版本 1.1.456,R 版本 3.5.1) - petzi
有时候我想指定列的类型,例如 R 日期,如果我填入 NA,那么后面填入的日期将会被转换成数字类型。 - Jiageng
1
@加更 as.Date(NA_character_) 返回一个类为 DateNA - Stibu
Tibbles的设计比data.frames更加严格。也许按设计,你不能只分配一部分来初始化列,但如果这是一个保护性特征而非设计错误,那么在tibble分配中早期出现一次性错误会更加可取。 - vinnief

20
我在使用“dplyr”包时遇到了这个问题。
对于那些在使用“dplyr”库中的“group_by”函数后遇到此问题的人们:

我发现取消变量的分组可以解决未知列警告问题。有时我不得不多次迭代取消分组,直到问题解决为止。


6
将类转换为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的部分脚本


它的效果非常好。我在想将其转换为数据框再转换回tibble是否有任何缺点。它只是失去了警告吗? - p130ter
2
对我来说没有用,仍然在使用RStudio 1.1.442时出现“警告信息:未知或未初始化的列:'bad_column'” - andemexoax

3

在处理tibble和lapply函数时,我曾遇到过这个问题。看起来tibble将东西保存为数据框中的列表。

在将lapply函数的结果添加到tibble之前,我通过使用unlist解决了这个问题。


1
我知道这是一个旧线程,但当我使用sf包加载geopackage格式的空间向量时,遇到了相同的问题。对我有用的是使用as_tibble=FALSE。文件被加载为sp对象,但一切仍然正常工作。正如@sabre所提到的,试图将对象强制转换为tibble似乎会在尝试索引不再存在的列时出现问题。

1

在@stok的答案基础上(https://dev59.com/WVkT5IYBdhLWcg3wG8D4#47848259),他在使用group_by(也会将您的data.frame转换为tibble)时发现了这个问题,并以同样的方式解决了它。

对我来说,问题最终是由于使用“slice()”引起的。Slice()将我的data.frame转换为tibble,导致了这个错误。

检查您的data.frame的类,并在函数将其转换为tibble时重新将其转换为data.frame,可以解决此问题。


好的。我认为这是一个有用的贡献,所以我会把它留作答案。 - Nicole Kappelhof

1

我也遇到了这个问题,但是是通过使用dyplyr块创建的tibble。这里稍微修改了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

0

当我使用dplyr :: rename重命名使用readr包读取的列时,会出现以下警告:

列的旧名称未在spec属性中重命名。因此,删除spec属性可以消除警告。另外,删除“spec_tbl_df”类似乎是个好主意。

attr(dat, "spec") <- NULL
class(dat) <- setdiff(class(dat), "spec_tbl_df")

0

假设我想选择以下列:

best.columns = 'id'

对我来说,以下内容会出现警告:

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

虽然这个代码可以正常工作,但据我所知,使用 dplyr 库应该是相同的。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接