2013-06-03 15 views
6

Mam skrypt, który wymaga bibliotek zarówno reshape, jak i reshape2. Wiem, że to jest kiepska praktyka, ale myślę, że plyr (lub inna biblioteka, której używam) Vennerable ładuje się reshape i osobiście użyłem reshape2 w wielu miejscach.Przekształć maskowanie pakietów, aby zapobiec stopieniu nazw kolumn

Problemem jest to, że maskowanie reshape2 przez reshape powoduje problemy dla melt funkcji

# 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 

myślałem mogę specjalnie zadzwonić melt z reshape2 użyciu reshape2::melt ale wciąż ten sam problem.

Czy istnieje prosty sposób obejścia tego? Jeśli nie, będę musiał ręcznie zmienić nazwy kolumn bezpośrednio po każdym wywołaniu melt.

+1

Nie sądzę najnowsza wersja '' reshape' plyr' korzysta już. Czy to jest jedyny powód, dla którego importujesz 'reshape'? – Peyton

+0

Nie importuję tego osobiście, ale myślę, że jest inna biblioteka i nie mogę tego obliczyć. Podejrzewałem, że to był plyr z powodu zamawiania ouput. – MattLBeck

+1

Sprawdź każdy z pakietów w następujący sposób: 'installed.packages() [installed.packages() [, 1] ==" ggplot2 ",]' – Roland

Odpowiedz

7

Użyj reshape2:::melt.data.frame(...).

melt jest rzeczywiście metoda:

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

Tak więc, w przypadku ramki danych, R wyszuka melt.data.frame, który jest w reshape:

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

Jak wskazano jednak, najlepszym rozwiązaniem może być tylko uaktualnienie wszystkiego. To prawda, że ​​ plyr użyte do załadowania reshape, ale już nie. (Edit: Myślałem ggplot2.)

+0

Ah, genialny. Próbowałem także 'reshape2 :: melt.data.frame (...)' ale nie wiedziałem, że potrzebuję trzech dwukropków (narzekałem, że 'melt.data.frame' nie został wyeksportowany inaczej). Również okrzyki za ulepszenie końcówki. – MattLBeck

+1

Tak, potrójny operator pobierze wartości wewnętrzne (tj. Nie wyeksportowane). – Peyton

+0

należy podać odpowiednią formę dla zbioru danych, w tym przypadku melt.data.frame, ale inne formy obejmują: melt.array, melt.list, melt.matrix, melt.table i melt.default (dla wektorów) – woodvi

0

Rozważmy rozładunku i ponownego załadunku pakiet przekształcić go ponownie, gdy konieczne

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