修复多个警告 “unknown column”;

我有一个持久的多个警告“unknown column”的所有类型的命令(例如,str(x)安装更新包),不知道应该如何调试或修复它。

警告 “unknown column” 显然与我重命名的tbl_df中的一个变量有关,但警告出现在各种命令中,似乎与tbl_df无关(例如,在包上安装更新,str(x),其中x只是一个字符向量)。

109741 次浏览

我一直遇到同样的问题,虽然我不知道为什么它发生,我已经能够确定它发生,从而防止它发生。

问题似乎是在基本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'

当然有更好的方法来避免这种情况,但我发现首先创建一个NAs的向量就可以了:

tibble_df$age <- NA


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

除了通过使用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

我在使用“dplyr”包时遇到过这个问题 对于那些在使用"dplyr"库中的"group_by"函数后面临这个问题的人:

.

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

这是RStudio中的诊断工具(该工具在代码中显示警告和可能的错误)的问题。在RStudio v1.1.103或更高版本的@kevin-ushey中,此提交部分被修复。这个修复是局部的,因为警告仍然出现(尽管频率降低了)。在https://github.com/rstudio/rstudio/issues/7372中报告了一个可重复的示例,并在RStudio v1.4 把请求中修复了此问题。

更新到最新的RStudio版本以修复此问题。或者,也有一些可行的解决方案,选择你喜欢的解决方案:

  • 禁用Preferences/ code / diagnostics中所有文件的代码诊断

  • 关闭指定文件的所有诊断:

    在打开的文件的开头添加:

     # !diagnostics off
    

    然后保存文件,警告应该会停止出现。

  • 关闭对引起警告的变量的诊断

    在打开的文件的开头添加:

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

    然后保存文件,警告应该会停止出现。

出现警告是因为RStudio中的诊断工具解析源代码以检测错误,当它执行诊断检查时,它会访问tibble中未初始化的列,给出我们所看到的警告。警告不会出现,因为您运行了不相关的事情,它们出现在RStudio诊断执行时(当文件被保存,然后修改,当您运行一些东西……)。

假设我想选择下面的列

best.columns = 'id'

对我来说,以下是警告:

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

虽然这是预期的工作,尽管,据我所知dplyr,这应该是相同的。

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

将类转换为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和lapply函数时遇到了这个问题。tibble似乎把东西保存为数据框架内的列表。

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

当我使用readr包读取一个列后,使用dplyr::rename重命名它时,我会得到这些警告。

spec属性中,列的旧名称不会重命名。因此,删除spec属性将使警告消失。同时删除&;spec_tbl_df"上课似乎是个好主意。

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

我知道这是一个旧线程,但我只是在用包sf加载地质包格式的空间向量时遇到了同样的问题。使用as_tibble=FALSE对我有用。该文件作为sp对象加载,但一切仍然正常工作。正如@sabre所提到的,试图将一个对象强制到tibble中似乎会在试图索引一个不再存在的列时产生问题。

基于@stok (https://stackoverflow.com/a/47848259/7733418)的回答,他在使用group_by(也将data.frame转换为tibble)时发现了这个问题,并以同样的方式解决了它。

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

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