【问题标题】:Fixing a multiple warning "unknown column"修复多个警告“未知列”
【发布时间】:2016-12-26 17:41:34
【问题描述】:

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

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

【问题讨论】:

  • 我意识到这个问题很模糊,但问题似乎也是如此。我什至可以输入废话(例如,错字)并收到警告。我猜它在 IDE 环境本身中是持久的,不知何故?
  • 你能发布确切的命令和你得到的输出吗?
  • 是的,最新版本的 RStudio。我清理了环境,重新启动,当我加载 TBL_DF 对象时它开始发生。我似乎已通过将其转换为 as.data.frame、关闭所有内容然后重新加载数据框来解决此问题。展望未来,我想了解两件事:如何使用 tbl_df 避免问题以及为什么警告似乎在环境中持续存在。
  • 我遇到了同样的错误。 FACEBOOK.1 是您的一个 data.frames 中的一列,您是否在 R 脚本中的某处使用 df$FACEBOOK.1 调用它?我的猜测是,这是 v1.1 中引入的 tibble 包中的错误:blog.rstudio.org/2016/07/05/tibble-1-1。您是否明确加载了tibble
  • 这也发生在我身上。我可以在多台计算机上重现该模式,但在某些命令(例如 library(Hmisc) 或使用 dplyr 制作数据帧之后)似乎随机出现警告。警告指的是我尚未创建的列 - 我稍后会在我的代码中创建它们。我已经多次重新启动 R 和 Rstudio 并且运行代码干净并没有帮助。这是什么???

标签: r dplyr


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是 RStudio 中的诊断工具(该工具在您的代码中显示警告和可能的错误)的问题。它在 RStudio v1.1.103 或更高版本中由 @kevin-ushey 部分修复为 commit。该修复是部分的,因为警告仍然出现(尽管频率较低)。此问题通过https://github.com/rstudio/rstudio/issues/7372 的可重现示例报告,并已在 RStudio v1.4 pull request 上修复。

    更新到最新的 RStudio 版本以解决此问题。或者,有几种可用的解决方法,请选择您喜欢的解决方案:

    • 禁用 Preferences/Code/Diagnostics 中所有文件的代码诊断

    • 禁用特定文件的所有诊断:

      在打开的文件开头添加:

       # !diagnostics off
      

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

    • 禁用导致警告的变量的诊断

      在打开的文件开头添加:

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

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

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

    【讨论】:

    • 好电话。这在 RStudio 0.99 中对我有用,在 Tools>Global Options>Code>Diagnostics 下取消选中“show diagnostics for r”
    • RStudio 1.1.383 和 R 3.4.3,问题依然存在。
    • 问题仍然存在于版本 1.1.423。取消选中“显示诊断”效果很好
    • 仍然存在 v1.1.456。叹息。
    • Sill 在 Ubuntu 上的 RStudio 服务器上存在 RStudio v1.1.643 和 R v3.5.1。
    【解决方案3】:

    当我在使用readr 包读取列后使用dplyr::rename 重命名列时收到这些警告。

    spec 属性中未重命名列的旧名称。因此,删除 spec 属性会使警告消失。删除“spec_tbl_df”类似乎也是个好主意。

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

    【讨论】:

      【解决方案4】:

      我在同时处理 tibble 和 lapply 函数时遇到了这个问题。小标题似乎将内容保存为数据框中的列表。

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

      【讨论】:

        【解决方案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 借来的部分脚本

        【讨论】:

        • 它就像一个魅力。我想知道将其转换为数据框然后将其转换回 tibble 是否有任何缺点。它丢失的只是警告吗?
        • 对我不起作用 RStudio 1.1.442 仍然得到Warning message: Unknown or uninitialised column: 'bad_column'
        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          假设我想选择以下列

          best.columns = 'id'
          

          对我来说,以下给出了警告:

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

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

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

              我也遇到过同样的问题,虽然我不知道为什么会发生,但我已经能够确定什么时候发生,从而防止它不会发生。

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

              这在不返回警告的情况下有效。但是,当对 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
              

              【讨论】:

              • 我的答案显然不是全部:我仍然收到(多个)警告,正如其他评论者所暗示的那样,令人沮丧的部分是 明显它。 tbl_df 似乎是产生警告所必需的,但我不确定它是否足够。也就是说,我认为当tbl_dfs 与其他 tidyverse 包(例如,tidyr、dplyr)中的函数结合使用时,可能会出现此警告。为如此重要的套件付出的代价很小,但仍然很奇怪/烦人。
              • 创建NAs 的向量对我有用! (RStudio 版本 1.1.456,R 版本 3.5.1)
              • 有时我想指定列的类型,例如R 日期,如果我填写NA,后面填写的日期将转换为数字类型。
              • @Jiāgěng as.Date(NA_character_)NA 提供 Date 类。
              • Tibbles 在设计上比 data.frames 更严格。可能是设计使然,您不应该通过仅为其分配部分来启动列。但是,如果这是一种保护功能而不是设计错误,那么在 tibble 分配中尽早出现一次性错误将是更可取的。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-11-11
              • 1970-01-01
              • 2011-03-20
              • 2011-08-21
              相关资源
              最近更新 更多