问题
I have a script which requires both reshape
and reshape2
libraries. I know this is poor practise, but I think plyr
(or another library I am using)Vennerable
is loading reshape
and I have personally used reshape2
in a lot of places.
The problem is that the masking of reshape2
by reshape
is causing problems for the melt
function
# 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
I thought I could specifically call melt
from reshape2
using reshape2::melt
but I still get the same problem.
Is there an easy way around this? If not I will have to manually relabel the column names straight after each melt call.
回答1:
Use reshape2:::melt.data.frame(...)
.
melt
is actually a method:
> reshape2::melt
function (data, ..., na.rm = FALSE, value.name = "value")
{
UseMethod("melt", data)
}
<environment: namespace:reshape2>
So, in the case of a data frame, R will search for melt.data.frame
, which is in reshape
:
> melt.data.frame
function (data, id.vars, measure.vars, variable_name = "variable",
na.rm = !preserve.na, preserve.na = TRUE, ...)
{
...
}
<environment: namespace:reshape>
As I indicated though, the best solution might just be to upgrade everything. It is true that (Edit: I was thinking ggplot2.)plyr
used to load reshape
, but it doesn't anymore.
回答2:
Consider unloading the reshape package and reloading it again when necessary
detach("package:reshape", unload=TRUE)
来源:https://stackoverflow.com/questions/16896632/reshape-package-masking-preventing-melt-from-naming-columns