R skimr Пользовательская функция скиммера не правильно форматирует - PullRequest
0 голосов
/ 04 июня 2019

Я хочу отформатировать вывод Skimr из пользовательской функции.

Я создал свою собственную функцию для вывода верхних уровней в факторизованном векторе вместе с их процентным содержанием от общего числа.Пользователь может указать совокупную сумму отсечки (например, уровни, которые составляют 75% данных).

Функция отключает функцию top_counts и выводит очень похожую таблицу данных.Когда выполняется skim (data), data.frame корректен, с правильными уровнями.Однако при выводе на экран вывод усекается.Однако top_counts печатает правильно.

Я попытался установить форматы скимра, но это не останавливает усечение.

Вот рабочий пример:


data <- data.frame(
  Sector=sample(c("aaaa","bbbb","cccc","dddd","eeee"),1000, replace=TRUE),
  Product=sample(c(rep("Y",900),rep("N",100))),
  Employees=round(rnorm(1000, mean = 100, sd = 20),digits=0)
)
data$Sector <- as.factor(data$Sector)
data$Product <- as.factor(data$Product)

# define how to calc top counts percentages:
# [keep only top cumulative %.  For binary outcomes, only keep "0" or "Y"]
top_counts_pc <- function (x,cutoff=75.0) 
{

  tab <- round(prop.table(table(x, useNA = "always"))*100,digits = 2)
  names_tab <- names(tab)
  if (is.element("", names_tab)) {
    names_tab[names_tab == ""] <- "empty"
    warning("Variable contains value(s) of \"\" that have been converted to \"empty\".")
  }
  out <- rlang::set_names(as.numeric(tab), names_tab)

  # if factor is 0/1 or Y/N only take the "1" or "Y"
  if (length(levels(x)) ==2 & ( length(setdiff(levels(x),c("0","1")))==0 | length(setdiff(levels(x),c("Y","N")))==0)) {
    out_binary <- out[levels(x) %in% c("1","Y")]
    out_binary[out_binary>cutoff]
  }
  else {
    #sort(out, decreasing = TRUE)
    sort(sort(out, decreasing = FALSE)[cumsum(sort(out, decreasing = FALSE)) > 100-cutoff ],decreasing = TRUE)
  }
}


# define relevant Skim stats
skim_with(
  numeric = list(missing=NULL,complete=NULL,sd=NULL,p0=NULL,p100=NULL,median=NULL,mean=NULL,n=NULL),
  factor = list(percent_counts = function(x) top_counts_pc(x,cutoff=75),missing=NULL,complete=NULL,
                n_unique=NULL,ordered=NULL,n=NULL),
  append = TRUE # don't list all default values
)

skim(data)
View(skim(data))

Выходные данные для сектора дают

top_counts: "eee: 216, ccc: 215, ddd: 195, bbb: 188"

но

процент_счета: "eee: 21,6, ccc: 21 "

Почему он обрезает вывод текста из моей пользовательской функции?

...