1010# ' @param method Treatment of ties. Can be one of `"average"` (default),
1111# ' `"first"`, `"last"`, `"random"`, `"max"` or `"min"`. See [rank()] for
1212# ' details.
13+ # ' @param zeros How to handle zeros. If `"na"` (default), they are marked as
14+ # ' `NA`. If `"signrank"`, they are kept during the ranking and marked as zeros.
15+ # ' This is only used when `sign = TRUE`.
1316# ' @param ... Arguments passed to or from other methods.
1417# ' @inheritParams extract_column_names
1518# ' @inheritParams standardize.data.frame
1922# ' @examples
2023# ' ranktransform(c(0, 1, 5, -5, -2))
2124# '
22- # ' # Won't work
23- # ' # ranktransform(c(0, 1, 5, -5, -2), sign = TRUE)
25+ # ' # By default, zeros are converted to NA
26+ # ' suppressWarnings(
27+ # ' ranktransform(c(0, 1, 5, -5, -2), sign = TRUE)
28+ # ' )
29+ # ' ranktransform(c(0, 1, 5, -5, -2), sign = TRUE, zeros = "signrank")
2430# '
2531# ' head(ranktransform(trees))
2632# ' @return A rank-transformed object.
@@ -38,13 +44,20 @@ ranktransform <- function(x, ...) {
3844ranktransform.numeric <- function (x ,
3945 sign = FALSE ,
4046 method = " average" ,
47+ zeros = " na" ,
4148 verbose = TRUE ,
4249 ... ) {
4350 # no change if all values are `NA`s
4451 if (all(is.na(x ))) {
4552 return (x )
4653 }
4754
55+ zeros <- match.arg(zeros , c(" na" , " signrank" ))
56+ method <- match.arg(
57+ method ,
58+ c(" average" , " first" , " last" , " random" , " max" , " min" )
59+ )
60+
4861 # Warning if only one value and return early
4962 if (insight :: has_single_value(x )) {
5063 if (is.null(names(x ))) {
@@ -54,7 +67,13 @@ ranktransform.numeric <- function(x,
5467 }
5568
5669 if (verbose ) {
57- insight :: format_warning(paste0(" Variable `" , name , " ` contains only one unique value and will not be normalized." ))
70+ insight :: format_warning(
71+ paste0(
72+ " Variable `" ,
73+ name ,
74+ " ` contains only one unique value and will not be normalized."
75+ )
76+ )
5877 }
5978
6079 return (x )
@@ -70,16 +89,31 @@ ranktransform.numeric <- function(x,
7089 }
7190
7291 if (verbose ) {
73- insight :: format_warning(paste0(" Variable `" , name , " ` contains only two different values. Consider converting it to a factor." ))
92+ # nolint
93+ insight :: format_warning(
94+ paste0(
95+ " Variable `" ,
96+ name ,
97+ " ` contains only two different values. Consider converting it to a factor."
98+ )
99+ )
74100 }
75101 }
76102
77-
78103 if (sign ) {
79- ZEROES <- x == 0
80- if (any(ZEROES ) && verbose ) insight :: format_warning(" Zeros detected. These cannot be sign-rank transformed." )
81- out <- rep(NA , length(x ))
82- out [! ZEROES ] <- sign(x [! ZEROES ]) * rank(abs(x [! ZEROES ]), ties.method = method , na.last = " keep" )
104+ if (zeros == " na" ) {
105+ out <- rep(NA , length(x ))
106+ ZEROES <- x == 0
107+ if (any(ZEROES ) && verbose ) {
108+ insight :: format_warning(" Zeros detected. These cannot be sign-rank transformed." ) # nolint
109+ }
110+ out [! ZEROES ] <- sign(x [! ZEROES ]) * rank(abs(x [! ZEROES ]),
111+ ties.method = method ,
112+ na.last = " keep"
113+ )
114+ } else if (zeros == " signrank" ) {
115+ out <- sign(x ) * rank(abs(x ), ties.method = method , na.last = " keep" )
116+ }
83117 } else {
84118 out <- rank(x , ties.method = method , na.last = " keep" )
85119 }
@@ -102,6 +136,7 @@ ranktransform.grouped_df <- function(x,
102136 method = " average" ,
103137 ignore_case = FALSE ,
104138 regex = FALSE ,
139+ zeros = " na" ,
105140 verbose = TRUE ,
106141 ... ) {
107142 info <- attributes(x )
@@ -143,6 +178,7 @@ ranktransform.data.frame <- function(x,
143178 method = " average" ,
144179 ignore_case = FALSE ,
145180 regex = FALSE ,
181+ zeros = " na" ,
146182 verbose = TRUE ,
147183 ... ) {
148184 # evaluate arguments
0 commit comments