dplyr掩盖GGally并打破ggparcoord

给定一个新的会话,执行函数文档中提供的一个小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))

结果如下图所示:

在这里输入图像描述

再次,从新鲜的会话开始,并使用加载的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))

结果是:

错误:(列表)对象不能被强制输入'double'

注意,库()语句的顺序并不重要。

问题

  • 代码示例有问题吗?
  • 有没有办法解决这个问题(通过一些命名空间函数)?
  • 或者这是一个错误?
  • 我需要在更大的分析中使用dplyr和ggparcoord(。),但这个最小的例子反映了我面临的问题。

    版本

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

    为了包装乔兰给出的优秀答案:

    答案

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

    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))
    

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

    这里的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包作者应该做的事来解决它。 你只需要知道,使用tbl_df和非Hadley编写的软件包可能会破坏事情。

    正如你所指出的那样,删除额外的类属性可以解决问题,因为它将R返回到使用普通的[方法。


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

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

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

    链接地址: http://www.djcxy.com/p/5227.html

    上一篇: dplyr masks GGally and breaks ggparcoord

    下一篇: How to use loess method in GGally::ggpairs using wrap function