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'

Обратите внимание, что порядок операторов библиотеки (.) Не имеет значения.

Вопросы

  1. Что-то не так с примерами кода?
  2. Есть ли способ преодолеть проблему (через некоторые функции пространства имен)?
  3. Или это ошибка?

Мне нужны и dplyr, и ggparcoord(.) В более широком анализе, но этот минимальный пример отражает проблему, с которой я сталкиваюсь.

Версии

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

ОБНОВИТЬ

Чтобы завершить отличный ответ, данный Джораном:

ответы

  1. Примеры кода на самом деле неверны, так как ggparcoord(.) Ожидает data.frame, а не tbl_df, как указано в наборе данных diamonds (если загружен 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))

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.

Другие вопросы по тегам