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
ОБНОВИТЬ
Чтобы завершить отличный ответ, данный Джораном:
ответы
- Примеры кода на самом деле неверны, так как ggparcoord(.) Ожидает data.frame, а не tbl_df, как указано в наборе данных diamonds (если загружен dplyr).
- Проблема решается путем приведения 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))
2 ответа
Преобразование моих комментариев в ответ...
Пакет GGally здесь делает разумное предположение, что использование [
на фрейме данных должен вести себя так, как всегда и всегда. Тем не менее, все это в стихах Хэдли, 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
С пакетами, написанными не Хэдли, могут что-то сломаться.
Как вы заметили, удаление дополнительных атрибутов класса решает проблему, так как возвращает R к использованию обычного [
метод.
Обходной путь: приведите ваши данные в ggparcoord
в as.data.table(...)
или же as.data.table(... , keep.rownames=TRUE)
если вы не хотите потерять все свои имена строк.
Причина: согласно расследованию @ Joran, когда dplyr
загружен, tbl_df
Переопределение [
так что падение = ЛОЖЬ.
Решение: подать пул-запрос на GGally.