我正在寻找创建衰老直方图。 我所说的账龄是指跟踪资产(如应付账款)的会计报告,将其分为 30 天、60 天、90 天和 120 天以上的账龄。
但是,就我而言,我需要跟踪自上次使用与会计师相同的数据箱为数据库中的表创建统计信息以来已经过去了多少天。 我希望这是有道理的。
我公司的脚本收集的数据有 2 个不可预测的观察量变量。 这两个变量是 NUM_TABLES(这是更新的表的数量)和 STATS_DATE(这是上次更新该数量表的统计信息的 YYYY-MM-DD)。
> head(df)
STATS_DATE NUM_TABLES
1 20210908 5
2 20240814 193
3 20240815 746
我想使用 bin 30、60、90、120+ 在直方图中报告此信息。 最终图表应类似于以下理想化图表,但不代表上面的示例数据:
我能够计算距离目标日期还有多少天。
# target date formatted to database's timezone
DATE <- parse_date_time("2024-08-16", "ymd", tz = "US/Central")
# calculate difference between target date and date column in days
df$DAYS <- as.numeric(DATE - df$STATS_DATE)
我似乎无法做的就是使用 NUM_TABLES 作为频率将它们组合在一起。
非常感谢任何帮助。
我尝试过使用 R 基本 hist 函数以及 ggplot2 函数。 我研究了 StackOverflow、Statology 等网站的各种功能和关键词。 不过,作为新手,我确实因缺乏对 R 术语的理解而苦苦挣扎。
假设您的数据采用以下格式:
> head(df)
STATS_DATE NUM_TABLES
1 20210908 5
2 20240814 193
3 20240815 746
您可以使用
cut
和适当的参数来“分类”日期:
library(lubridate)
library(dplyr)
library(ggplot2)
df <- mutate(df,
STATS_DATE=parse_date_time(STATS_DATE, tz = "US/Central", orders = "Ymd"),
DAYS=as.numeric(DATE - STATS_DATE),
DAYS_OLD=cut(DAYS,
breaks=c(0,30,60,90,120,Inf),
labels=c("0-30","31-60","61-90","91-120",">120")))
然后使用
summarise
中的 dplyr
总结这一点,然后您可以将其传递给 ggplot
:
summarise(df, NUM_TABLES=sum(NUM_TABLES), .by=DAYS_OLD) |>
print() |>
ggplot(aes(x=DAYS_OLD, y=NUM_TABLES, fill=DAYS_OLD)) +
geom_col(show.legend=FALSE, col=1) +
labs(x="Days old", y="Number of tables") +
theme_classic()
制作:
DAYS_OLD NUM_TABLES
1 91-120 185
2 >120 554
3 31-60 251
4 61-90 303
5 0-30 240
玩具数据:
df <- structure(list(STATS_DATE = c("20240705", "20240220", "20240619",
"20240710", "20240719", "20240508", "20240513", "20240723", "20240628",
"20240303", "20240422", "20240313", "20240617", "20240316", "20240208",
"20240728", "20240611", "20240409", "20240319", "20240428", "20240504",
"20240601", "20240813", "20240622", "20240415", "20240511", "20240312",
"20240419", "20240424", "20240727"), NUM_TABLES = c(75, 7, 9,
11, 41, 98, 17, 51, 21, 21, 19, 28, 14, 86, 65, 61, 97, 38, 82,
23, 21, 20, 25, 98, 53, 83, 67, 98, 7, 34)), class = "data.frame", row.names = c(NA,
-30L))
生成使用:
N <- 30
set.seed(2)
df <- data.frame(STATS_DATE=gsub("-", "", sample(seq.Date(as.Date("2024-02-08"),
as.Date("2024-08-15"), 1), N)),
NUM_TABLES=round(runif(N, 1, 100)))