Я хочу отформатировать вывод 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 "
Почему он обрезает вывод текста из моей пользовательской функции?