9

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

请注意,library(.)语句的顺序无关紧要

问题

  1. 代码示例有问题吗?
  2. 有没有办法克服这个问题(通过一些命名空间函数)?
  3. 或者这是一个错误?

我需要dplyrggparcoord(.)在更大的分析中,但这个最小的例子反映了我面临的问题。

版本

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

更新

总结 Joran 给出的出色答案:

答案

  1. 代码示例实际上是错误的,因为ggparcoord(.)需要一个data.frame而不是diamonds数据集给出的 tbl_df(如果加载了 dplyr)。
  2. 通过将tbl_df强制为data.frame来解决问题。
  3. 不,这不是错误。

工作代码示例:

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

2 回答 2

16

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

这里的 GGally 包做出了合理的假设,即[在数据帧上使用的行为应该始终如一。然而,这一切都在 Hadley-verse 中,diamonds数据集是 atbl_df和 a data.frame

加载dplyr时, 的行为将[被覆盖,这drop = FALSE始终是 a 的默认值tbl_df。所以在GGally中有一个地方data[,"cut"]应该返回一个向量,但它返回另一个数据框。

...具体来说,在您的示例中尝试执行时会引发错误:

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

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

至于您认为这不是错误的结论,我想说....也许。大概。至少GGally包作者可能不需要做任何事情来解决它。您只需要注意,将tbl_df's 与非 Hadley 编写的软件包一起使用可能会破坏事情。

正如您所指出的,删除额外的类属性可以解决问题,因为它会返回 R 以使用正常[方法。

于 2016-02-11T01:50:06.360 回答
1

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

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

解决方案:在 GGally 上提交拉取请求。 编辑:在 v1.3.0 中修复( https://github.com/ggobi/ggally/commit/bfa930d102289d723de2ce9ec528baf42b3b7b40

于 2017-03-13T12:37:06.693 回答