Skip to content

Commit d732e4d

Browse files
melt.data.frame
1 parent a599557 commit d732e4d

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed

NAMESPACE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ S3method(split, data.table)
126126
export(dcast, melt)
127127
S3method(dcast, data.table)
128128
S3method(melt, data.table)
129+
S3method(melt, data.frame)
129130
S3method(melt, default)
130131

131132
# exported for historical reasons -- if reshape2 is higher on search path,

R/fmelt.R

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ melt = function(data, ..., na.rm = FALSE, value.name = "value") {
77
UseMethod("melt", data)
88
}
99

10+
melt.data.frame = function(data, ..., na.rm=FALSE, value.name="value") setDF(melt(as.data.table(data), ..., na.rm=na.rm, value.name=value.name))
11+
1012
# TODO(>=1.19.0): Remove this, just let dispatch to 'default' method fail.
1113
melt.default = function(data, ..., na.rm = FALSE, value.name = "value") {
1214
stopf("The %1$s generic in data.table has been passed a %2$s and will attempt to redirect to the relevant reshape2 method; please note that reshape2 is superseded and is no longer actively developed, and this redirection is now deprecated. To continue using melt methods from reshape2 while both packages are attached, e.g. melt.list, you can prepend the namespace, i.e. reshape2::%1$s(%3$s). In the next version, this warning will become an error.", "melt", class1(data), deparse(substitute(data))) # nocov

inst/tests/tests.Rraw

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3167,8 +3167,10 @@ test(1034, as.data.table(x<-as.character(sample(letters, 5))), data.table(V1=x))
31673167
c_1 = sample(c(letters[1:3], NA), N, TRUE),
31683168
d_1 = as.Date(c(1:3,NA,4:5), origin="2013-09-01"),
31693169
d_2 = as.Date(6:1, origin="2012-01-01"))
3170-
DT[, l_1 := DT[, list(c=list(rep(i_1, sample(5,1)))), by = i_1]$c] # generate list cols
3171-
DT[, l_2 := DT[, list(c=list(rep(c_1, sample(5,1)))), by = i_1]$c]
3170+
DT[, `:=`(
3171+
l_1=lapply(i_1, function(x) rep(x, sample(5L, 1L))),
3172+
l_2=lapply(c_1, function(x) rep(x, sample(5L, 1L)))
3173+
)]
31723174

31733175
test(1035.010, melt(DT, id.vars=1:2, measure.vars=3:4), melt(DT, id.vars=c("i_1", "i_2"), measure.vars=c("f_1", "c_1")))
31743176
test(1035.011, melt(DT, id.vars=as.raw(0), measure.vars=3:4),
@@ -3300,6 +3302,41 @@ test(1034, as.data.table(x<-as.character(sample(letters, 5))), data.table(V1=x))
33003302
test(1035.31, melt(dt, measure.vars=NA_character_), error="One or more values in 'measure.vars'")
33013303
test(1035.32, melt(dt, id.vars=NA_character_), error="One or more values in 'id.vars'")
33023304

3305+
# melt.data.frame (#4024). Copied earlier 1035.* tests with data.frame input and other appropriate adjustments (esp. around row names)
3306+
N=18L # increased in v1.12.2 from 6 to 18 to get NA in f_1 for coverage
3307+
DF <- data.frame(
3308+
i_1 = c(1:(N-1L), NA),
3309+
i_2 = c(NA,(N:(2L*N-2L))),
3310+
f_1 = factor(sample(c(letters[1:3], NA), N, TRUE)),
3311+
c_1 = sample(c(letters[1:3], NA), N, TRUE),
3312+
d_1 = as.Date(c(1:3,NA,4:5), origin="2013-09-01"),
3313+
d_2 = as.Date(6:1, origin="2012-01-01"))
3314+
DF$l_1 = lapply(DF$i_1, function(x) rep(x, sample(5L, 1L)))
3315+
DF$l_2 = lapply(DF$c_1, function(x) rep(x, sample(5L, 1L)))
3316+
3317+
test(1035.33, melt(DF, id.vars=1:2, measure.vars=3:4), melt(DF, id.vars=c("i_1", "i_2"), measure.vars=c("f_1", "c_1")))
3318+
test(1035.34, melt(DF, id.vars=as.raw(0), measure.vars=3:4), error="Unknown 'id.vars' type raw")
3319+
test(1035.35, melt(DF, id.vars=1:3, measure.vars=as.raw(0)), error="Unknown 'measure.vars' type raw")
3320+
3321+
ans1 = cbind(DF[c(1L, 2L, 8L)], variable=factor("l_1"))
3322+
ans1$value = DF$l_1
3323+
test(1035.36, melt(DF, id.vars=c("i_1", "i_2", "l_2"), measure.vars="l_1"), ans1)
3324+
3325+
ans2 = subset(data.frame(c_1=DF$c_1, variable=rep(c("d_1", "d_2"), each=N), value=as.Date(c(DF$d_1, DF$d_2), origin="1970-01-01")), !is.na(value)) # NB: origin= required for some old R versions
3326+
rownames(ans2) = seq_len(nrow(ans2))
3327+
test(1035.37, melt(DF, id.vars=4, measure.vars=5:6, na.rm=TRUE, variable.factor=FALSE), ans2)
3328+
3329+
DF$f_2 = factor(sample(letters, N), ordered=TRUE)
3330+
DF$id = seq_len(nrow(DF))
3331+
ans1 = cbind(
3332+
melt(DF, id.vars="id", measure.vars=5:6, value.name="value1"),
3333+
within(melt(DF, id.vars=integer(0), measure.vars=7:8, value.name="value2"), rm("variable")))
3334+
levels(ans1$variable) = as.character(1:2)
3335+
test(1035.38, melt(DF, id.vars="id", measure.vars=list(5:6, 7:8)), ans1)
3336+
## use numeric index
3337+
test(1035.39, melt(DF, id.vars="id", measure.vars=list(c(5, 6), c(7, 8))), ans1)
3338+
test(1035.40, melt(DF, id.vars="id", measure.vars=patterns("d_", "l_")), ans1)
3339+
33033340
if (test_R.utils) {
33043341
# dup names in variable used to generate malformed factor error and/or segfault, #1754; was test 1570
33053342
R.utils::decompressFile(testDir("melt_1754.R.gz"), tt<-tempfile(), remove=FALSE, FUN=gzfile, ext=NULL)

0 commit comments

Comments
 (0)