Skip to content

Commit 7920cad

Browse files
Align melt with docs for list measure.vars (#7266)
1 parent 1a5003b commit 7920cad

File tree

3 files changed

+8
-9
lines changed

3 files changed

+8
-9
lines changed

NEWS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
1. `dcast()` now errors when `fun.aggregate` returns length != 1 (consistent with documentation), regardless of `fill`, [#6629](https://github.com/Rdatatable/data.table/issues/6629). Previously, when `fill` was not `NULL`, `dcast` warned and returned an undefined result. This change has been planned since 1.16.0 (25 Aug 2024).
1414

15+
2. `melt()` returns an integer column for `variable` when `measure.vars` is a list of length=1, consistent with the documented behavior, [#5209](https://github.com/Rdatatable/data.table/issues/5209). Thanks to @tdhock for reporting. Any users who were relying on this behavior can change `measure.vars=list("col_name")` (output `variable` was column name, now is column index/integer) to `measure.vars="col_name"` (`variable` still is column name). This change has been planned since 1.16.0 (25 Aug 2024).
16+
1517
### NEW FEATURES
1618

1719
1. New `sort_by()` method for data.tables, [#6662](https://github.com/Rdatatable/data.table/issues/6662). It uses `forder()` to improve upon the data.frame method and also matches `DT[order(...)]` behavior with respect to locale. Thanks @rikivillalba for the suggestion and PR.

inst/tests/tests.Rraw

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17421,13 +17421,13 @@ exid = data.table(id=1, expected)
1742117421
test(2182.3, melt(DTid, measure.vars=list(a=c(NA,1), b=2:3), id.vars="id"), exid)
1742217422
test(2182.4, melt(DTid, measure.vars=list(a=c(NA,"a2"), b=c("b1","b2")), id.vars="id"), exid)
1742317423
test(2182.5, melt(DT.wide, measure.vars=list(a=c(NA,1), b=2:3), na.rm=TRUE), data.table(variable=factor(2), a=2, b=2))
17424-
test(2182.6, melt(DT.wide, measure.vars=list(b=c("b1","b2"))), data.table(a2=2, variable=factor(c("b1","b2")), b=c(1,2)), warning="measure.vars is a list with length=1") # measure.vars named list length=1, #5065
17424+
test(2182.6, melt(DT.wide, measure.vars=list(b=c("b1","b2"))), data.table(a2=2, variable=factor(c("1","2")), b=c(1,2))) # measure.vars named list length=1, #5065
1742517425
# consistency between measure.vars=list with length=1 and length>1, #5209
17426-
test(2182.71, melt(DT.wide, measure.vars=list("a2"), variable.factor=TRUE), data.table(b1=1, b2=2, variable=factor("a2"), value=2), warning="measure.vars is a list with length=1")
17426+
test(2182.71, melt(DT.wide, measure.vars=list("a2"), variable.factor=TRUE), data.table(b1=1, b2=2, variable=factor(1), value=2))
1742717427
test(2182.72, melt(DT.wide, measure.vars=c("a2"), variable.factor=TRUE), data.table(b1=1, b2=2, variable=factor("a2"), value=2))
17428-
test(2182.73, melt(DT.wide, measure.vars=list("a2"), variable.factor=FALSE), data.table(b1=1, b2=2, variable="a2", value=2), warning="measure.vars is a list with length=1")
17428+
test(2182.73, melt(DT.wide, measure.vars=list("a2"), variable.factor=FALSE), data.table(b1=1, b2=2, variable="1", value=2))
1742917429
test(2182.74, melt(DT.wide, measure.vars=c("a2"), variable.factor=FALSE), data.table(b1=1, b2=2, variable="a2", value=2))
17430-
test(2182.75, melt(data.table(a=10, b=20), measure.vars=list(n="a"), variable.factor=FALSE), data.table(b=20, variable="a", n=10), warning="measure.vars is a list with length=1")#thanks @mnazarov
17430+
test(2182.75, melt(data.table(a=10, b=20), measure.vars=list(n="a"), variable.factor=FALSE), data.table(b=20, variable="1", n=10))#thanks @mnazarov
1743117431

1743217432
### First block testing measurev
1743317433
# new variable_table attribute for measure.vars, PR#4731 for multiple issues

src/fmelt.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -598,12 +598,9 @@ SEXP getvarcols(SEXP DT, SEXP dtnames, Rboolean varfactor, Rboolean verbose, str
598598
if (data->lvalues==1 && length(VECTOR_ELT(data->valuecols, 0)) != data->lmax)
599599
internal_error(__func__, "getvarcols %d %d", length(VECTOR_ELT(data->valuecols, 0)), data->lmax); // # nocov
600600
if (isNull(data->variable_table)) {
601-
if ((data->lvalues == 1) & data->measure_is_list) {
602-
warning(_("measure.vars is a list with length=1, which as long documented should return integer indices in the 'variable' column, but currently returns character column names. To increase consistency in the next release, we plan to change 'variable' to integer, so users who were relying on this behavior should change measure.vars=list('col_name') (output variable is column name now, but will become column index/integer) to measure.vars='col_name' (variable is column name before and after the planned change)."));
603-
}
604601
if (!varfactor) {
605602
SET_VECTOR_ELT(ansvars, 0, target=allocVector(STRSXP, data->totlen));
606-
if (data->lvalues == 1) {//one value column to output. TODO #5247 change to !data->measure_is_list
603+
if (!data->measure_is_list) {//one value column to output.
607604
const int *thisvaluecols = INTEGER(VECTOR_ELT(data->valuecols, 0));
608605
for (int j=0, ansloc=0; j<data->lmax; ++j) {
609606
const int thislen = data->narm ? length(VECTOR_ELT(data->not_NA_indices, j)) : data->nrow;
@@ -622,7 +619,7 @@ SEXP getvarcols(SEXP DT, SEXP dtnames, Rboolean varfactor, Rboolean verbose, str
622619
SET_VECTOR_ELT(ansvars, 0, target=allocVector(INTSXP, data->totlen));
623620
SEXP levels;
624621
int *td = INTEGER(target);
625-
if (data->lvalues == 1) {//one value column to output. TODO #5247 change to !data->measure_is_list
622+
if (!data->measure_is_list) {//one value column to output.
626623
SEXP thisvaluecols = VECTOR_ELT(data->valuecols, 0);
627624
int len = length(thisvaluecols);
628625
levels = PROTECT(allocVector(STRSXP, len)); protecti++;

0 commit comments

Comments
 (0)