2013-06-03 7 views
6

У меня есть скрипт, который требует как библиотек reshape, так и reshape2. Я знаю, что это плохая практика, но я думаю, что plyr (или другая библиотека, которую я использую) Vennerable загружается reshape, и я лично использовал reshape2 во многих местах.Перетаскивание маски пакета, предотвращающее расплавление от имен столбцов

Проблема заключается в том, что маскировка reshape2 по reshape вызывает проблемы для функции melt

# Example data frame 
df <- data.frame(id=c(1:5), a=c(rnorm(5)), b=c(rnorm(5))) 

# With just reshape2, variable and value columns are labelled correctly 
library(reshape2) 
melt(df, measure.vars=c("a", "b"), variable.name="type", value.name="distance") 
    id type distance 
1 1 a -2.0233666 
2 2 a 0.4625188 
3 3 a -2.8688127 
4 4 a 0.8151644 
5 5 a -0.4574464 
6 1 b 1.3197784 
7 2 b 1.6213146 
8 3 b 1.3508913 
9 4 b -1.6483839 
10 5 b -1.1342157 

# But my script also has reshape loaded 
library(reshape) 
Loading required package: plyr 

Attaching package: ‘reshape’ 

The following object(s) are masked from ‘package:plyr’: 

    rename, round_any 

The following object(s) are masked from ‘package:reshape2’: 

    colsplit, melt, recast 

# When calling melt in this environment, variable and value columns stick to 
# their default names 
melt(df, measure.vars=c("a", "b"), variable.name="type", value.name="distance") 
    id variable  value 
1 1  a -2.0233666 
2 2  a 0.4625188 
3 3  a -2.8688127 
4 4  a 0.8151644 
5 5  a -0.4574464 
6 1  b 1.3197784 
7 2  b 1.6213146 
8 3  b 1.3508913 
9 4  b -1.6483839 
10 5  b -1.1342157 

Я думал, что я мог бы конкретно назвать melt из reshape2 с помощью reshape2::melt, но я все еще получаю ту же проблему.

Есть ли простой способ обойти это? Если нет, мне придется вручную перемаркировать имена столбцов сразу после каждого вызова расплава.

+1

Я не думаю, что новая версия '' plyr' использует reshape' больше. Это единственная причина, по которой вы импортировали 'reshape'? – Peyton

+0

Я не импортирую его лично, но я думаю, что другая библиотека есть, и я не могу решить, какой. Я подозревал, что это было plyr из-за заказа на выход. – MattLBeck

+1

Проверьте каждый из пакетов следующим образом: 'installed.packages() [installed.packages() [, 1] ==" ggplot2 ",]' – Roland

ответ

7

Использование reshape2:::melt.data.frame(...).

melt на самом деле метод:

> reshape2::melt 
function (data, ..., na.rm = FALSE, value.name = "value") 
{ 
    UseMethod("melt", data) 
} 
<environment: namespace:reshape2> 

Таким образом, в случае кадра данных, R будет искать melt.data.frame, который находится в reshape:

> melt.data.frame 
function (data, id.vars, measure.vars, variable_name = "variable", 
    na.rm = !preserve.na, preserve.na = TRUE, ...) 
{ 
    ... 
} 
<environment: namespace:reshape> 

Как я уже указывал, хотя, лучшим решением может быть просто обновление всего. Это правда, что plyr использовался для загрузки reshape, но его больше нет. (Edit: Я думал ggplot2.)

+0

Ах, блестящий. Я также пытался «reshape2 :: melt.data.frame (...)», но не знал, что мне нужны три двоеточия (он жаловался, что «melt.data.frame» не был экспортирован в противном случае). Кроме того, приветствует обновление наконечника. – MattLBeck

+1

Да, оператор тройной двоеточия будет захватывать внутренние (то есть не экспортированные) значения. – Peyton

+0

не забудьте указать соответствующую форму для вашего набора данных, в данном случае melt.data.frame, но другие формы включают: melt.array, melt.list, melt.matrix, melt.table и melt.default (для векторов) – woodvi

0

Рассмотрим выгрузки пакета перекроить и перезагрузки снова при необходимости

detach("package:reshape", unload=TRUE)