lgb.prepare.R 2.7 KB
Newer Older
1
2
3
4
5
#' @name lgb.prepare
#' @title Data preparator for LightGBM datasets (numeric)
#' @description Attempts to prepare a clean dataset to prepare to put in a \code{lgb.Dataset}.
#'              Factors and characters are converted to numeric without integers. Please use
#'              \code{\link{lgb.prepare_rules}} if you want to apply this transformation to other datasets.
6
#' @param data A data.frame or data.table to prepare.
7
8
#' @return The cleaned dataset. It must be converted to a matrix format (\code{as.matrix})
#'         for input in \code{lgb.Dataset}.
9
#'
10
11
#' @examples
#' data(iris)
12
#'
13
#' str(iris)
14
#'
15
#' str(lgb.prepare(data = iris)) # Convert all factors/chars to numeric
16
#'
17
#' \dontrun{
18
19
20
21
22
23
24
25
26
27
#' # When lightgbm package is installed, and you do not want to load it
#' # You can still use the function!
#' lgb.unloader()
#' str(lightgbm::lgb.prepare(data = iris))
#' # 'data.frame':	150 obs. of  5 variables:
#' # $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#' # $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#' # $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#' # $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#' # $ Species     : num  1 1 1 1 1 1 1 1 1 1 ...
28
#' }
29
#'
30
31
#' @export
lgb.prepare <- function(data) {
32

33
34
  # data.table not behaving like data.frame
  if ("data.table" %in% class(data)) {
35

36
37
    # Get data classes
    list_classes <- sapply(data, class)
38

39
40
    # Convert characters to factors only (we can change them to numeric after)
    is_char <- which(list_classes == "character")
41
    if (length(is_char) > 0L) {
42
43
      data[, (is_char) := lapply(.SD, function(x) {as.numeric(as.factor(x))}), .SDcols = is_char]
    }
44

45
46
    # Convert factors to numeric (integer is more efficient actually)
    is_fact <- c(which(list_classes == "factor"), is_char)
47
    if (length(is_fact) > 0L) {
48
49
      data[, (is_fact) := lapply(.SD, function(x) {as.numeric(x)}), .SDcols = is_fact]
    }
50

51
  } else {
52

53
54
    # Default routine (data.frame)
    if ("data.frame" %in% class(data)) {
55

56
57
      # Get data classes
      list_classes <- sapply(data, class)
58

59
      # Convert characters to factors to numeric
60
      is_char <- which(list_classes == "character")
61
      if (length(is_char) > 0L) {
62
63
        data[is_char] <- lapply(data[is_char], function(x) {as.numeric(as.factor(x))})
      }
64

65
      # Convert factors to numeric
66
      is_fact <- which(list_classes == "factor")
67
      if (length(is_fact) > 0L) {
68
69
        data[is_fact] <- lapply(data[is_fact], function(x) {as.numeric(x)})
      }
70

71
    } else {
72

73
      stop(
74
        "lgb.prepare: you provided "
75
        , paste(class(data), collapse = " & ")
76
        , " but data should have class data.frame or data.table"
77
      )
78

79
    }
80

81
  }
82

83
  return(data)
84

85
}