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(。),但这个最小的例子反映了我面临的问题。
版本
UPDATE
为了包装乔兰给出的优秀答案:
答案
工作代码示例:
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
的数据ggparcoord
为as.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