diff --git a/R-package/NAMESPACE b/R-package/NAMESPACE index aa1f0f64e..3fc74663e 100644 --- a/R-package/NAMESPACE +++ b/R-package/NAMESPACE @@ -1,6 +1,7 @@ # Generated by roxygen2 (4.0.1): do not edit by hand export(getinfo) +export(slice) export(xgb.DMatrix) export(xgb.DMatrix.save) export(xgb.dump) diff --git a/R-package/R/slice.xgb.DMatrix.R b/R-package/R/slice.xgb.DMatrix.R new file mode 100644 index 000000000..d27d08d4f --- /dev/null +++ b/R-package/R/slice.xgb.DMatrix.R @@ -0,0 +1,30 @@ +setClass('xgb.DMatrix') + +#' Get a new DMatrix containing the specified rows of +#' orginal xgb.DMatrix object +#' +#' Get a new DMatrix containing the specified rows of +#' orginal xgb.DMatrix object +#' +#' @param object Object of class "xgb.DMatrix" +#' @param idxset a integer vector of indices of rows needed +#' +#' @examples +#' data(iris) +#' iris[,5] <- as.numeric(iris[,5]) +#' dtrain <- xgb.DMatrix(as.matrix(iris[,1:4]), label=iris[,5]) +#' dsub <- slice(dtrain, c(1,2,3)) +#' @export +#' +slice <- function(object, ...){ + UseMethod("slice") +} + +setMethod("slice", signature = "xgb.DMatrix", + definition = function(object, idxset) { + if (class(object) != "xgb.DMatrix") { + stop("slice: first argument dtrain must be xgb.DMatrix") + } + ret <- .Call("XGDMatrixSliceDMatrix_R", object, idxset, PACKAGE = "xgboost") + return(structure(ret, class = "xgb.DMatrix")) + }) diff --git a/R-package/man/slice.Rd b/R-package/man/slice.Rd new file mode 100644 index 000000000..216e23981 --- /dev/null +++ b/R-package/man/slice.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2 (4.0.1): do not edit by hand +\name{slice} +\alias{slice} +\title{Get a new DMatrix containing the specified rows of +orginal xgb.DMatrix object} +\usage{ +slice(object, ...) +} +\arguments{ +\item{object}{Object of class "xgb.DMatrix"} + +\item{idxset}{a integer vector of indices of rows needed} +} +\description{ +Get a new DMatrix containing the specified rows of +orginal xgb.DMatrix object +} +\examples{ +data(iris) +iris[,5] <- as.numeric(iris[,5]) +dtrain <- xgb.DMatrix(as.matrix(iris[,1:4]), label=iris[,5]) +dsub <- slice(dtrain, c(1,2,3)) +} + diff --git a/R-package/src/xgboost_R.cpp b/R-package/src/xgboost_R.cpp index 1ca232509..a353041e0 100644 --- a/R-package/src/xgboost_R.cpp +++ b/R-package/src/xgboost_R.cpp @@ -91,6 +91,18 @@ extern "C" { UNPROTECT(1); return ret; } + SEXP XGDMatrixSliceDMatrix_R(SEXP handle, SEXP idxset) { + int len = length(idxset); + std::vector idxvec(len); + for (int i = 0; i < len; ++i) { + idxvec[i] = INTEGER(idxset)[i] - 1; + } + void *res = XGDMatrixSliceDMatrix(R_ExternalPtrAddr(handle), &idxvec[0], len); + SEXP ret = PROTECT(R_MakeExternalPtr(res, R_NilValue, R_NilValue)); + R_RegisterCFinalizerEx(ret, _DMatrixFinalizer, TRUE); + UNPROTECT(1); + return ret; + } void XGDMatrixSaveBinary_R(SEXP handle, SEXP fname, SEXP silent) { XGDMatrixSaveBinary(R_ExternalPtrAddr(handle), CHAR(asChar(fname)), asInteger(silent)); diff --git a/R-package/src/xgboost_R.h b/R-package/src/xgboost_R.h index 4cc353f4e..ecacdeced 100644 --- a/R-package/src/xgboost_R.h +++ b/R-package/src/xgboost_R.h @@ -36,6 +36,13 @@ extern "C" { SEXP XGDMatrixCreateFromCSC_R(SEXP indptr, SEXP indices, SEXP data); + /*! + * \brief create a new dmatrix from sliced content of existing matrix + * \param handle instance of data matrix to be sliced + * \param idxset index set + * \return a sliced new matrix + */ + SEXP XGDMatrixSliceDMatrix_R(SEXP handle, SEXP idxset); /*! * \brief load a data matrix into binary file * \param handle a instance of data matrix