dplyr掩盖GGally并打破ggparcoord

时间:2016-02-10 22:28:03

标签: r ggplot2 dplyr ggally parallel-coordinates

鉴于新的会议, 执行函数文档中提供的小型 ggparcoord(。)示例

library(GGally)

data(diamonds, package="ggplot2")
diamonds.samp <- diamonds[sample(1:dim(diamonds)[1], 100), ]
ggparcoord(data = diamonds.samp, columns = c(1, 5:10))

结果如下:

enter image description here

再次,从一个新的会话开始并使用加载的 dplyr

执行相同的脚本
library(GGally)
library(dplyr)

data(diamonds, package="ggplot2")
diamonds.samp <- diamonds[sample(1:dim(diamonds)[1], 100), ]
ggparcoord(data = diamonds.samp, columns = c(1, 5:10))

结果:

  

错误:( list)对象无法强制输入'double'

请注意,库(。)语句的顺序很重要。

问题

  1. 代码示例有问题吗?
  2. 有没有办法克服这个问题(通过某些命名空间函数)?
  3. 或者这是一个错误吗?
  4. 我需要更大的分析中的 dplyr ggparcoord(。),但这个最小的例子反映了我面临的问题。

    版本

    • R @ 3.2.3
    • dplyr @ 0.4.3
    • GGally @ 1.0.1
    • ggplot @ 2.0.0

    更新

    将Joran给出的优秀答案包括起来:

    答案

    1. 代码示例实际上是错误的,因为 ggparcoord(。)期望 data.frame 而不是 tbl_df 由钻石数据给出set(如果加载了dplyr)。
    2. 通过将 tbl_df 强制转换为 data.frame 来解决问题。
    3. 不,这不是一个错误。
    4. 工作代码示例:

      library(GGally)
      library(dplyr)
      
      data(diamonds, package="ggplot2")
      diamonds.samp <- diamonds[sample(1:dim(diamonds)[1], 100), ]
      ggparcoord(data = as.data.frame(diamonds.samp), columns = c(1, 5:10))
      

2 个答案:

答案 0 :(得分:16)

将我的评论转换为答案......

这里的GGally包正在合理地假设在数据框上使用[应该按照它始终如一的方式运行。但是,这一切都在Hadley-verse中,diamonds数据集是tbl_df以及data.frame

加载 dplyr 时,会覆盖[的行为,因此drop = FALSE始终是tbl_df的默认行为。所以在 GGally 中有一个位置,其中data[,"cut"]应该返回一个向量,而是返回另一个数据框。

...具体而言,在尝试执行时,您的示例中会抛出错误:

data[, fact.var] <- as.numeric(data[, fact.var]). 

由于data[,fact.var]仍然是数据框,因此列表,as.numeric将不起作用。

至于你的结论,这不是一个错误,我会说....也许。大概。至少可能没有 GGally 包作者应该做的任何事情来解决它。你必须要知道,使用非{Hadley书面包的tbl_df可能会破坏事物。

如您所述,删除额外的类属性可以解决问题,因为它使用普通的[方法返回R。

答案 1 :(得分:0)

解决方法:强制您将ggparcoord的数据强制转换为as.data.table(...)as.data.table(... , keep.rownames=TRUE),除非您想丢失所有的rownames。

原因:根据@joran的调查,加载dplyr时,tbl_df会覆盖[,因此drop = FALSE。

解决方案:在GGally上提交拉取请求。