我在 R 中有一个时间与计数的阶梯线图,我需要更改其垃圾箱。具体来说,我需要聚合计数变化小于 10 的地方,但保持其余部分不变。
例如:
set.seed(123) # for reproducibility
time <- c(0,sort(sample.int(365,50)))
counts <- c(1000,sort(sample.int(1000,50), decreasing = TRUE))
plot(x = time, y = counts, type = "S")
从一次到下一次,有几个步骤的计数变化小于 10。我正在寻找一种方法来聚合这些步骤,以便所有计数变化都大于 10。
我尝试使用 DPLYR 在此基础上计算计数和聚合之间的差异,但是当多个计数的差异小于 10 时(例如 counts = c(57,55, 49))。
我还尝试寻找是否可以直接在 ggplot2 中完成,但结果很干燥。
感谢您的任何帮助,谢谢!
不知道等了这么久你这个问题解决了吗? 简单的解决方案是计算所有步长,然后删除所有步长 < 10. However, this is over-zealous since some successive steps of <10 each will sum to >= 10 的数据帧行。多次滞后数据可以让您找到实现目标的最小删除次数:
suppressPackageStartupMessages(library(tidyverse))
set.seed(123) # for reproducibility
time <- c(0, sort(sample.int(365,50)))
counts <- c(1000, sort(sample.int(1000,50), decreasing = TRUE))
plot(x = time, y = counts, type = "S")
df <- data.frame(time, counts)
# Need the dplyr::lag() here not the stats::lag()
df$previous <- dplyr::lag(df$counts)
df$step <- df$previous - df$counts
df$needs_binning <- ifelse((is.na(df$step)) | (df$step >= 10), FALSE, TRUE)
# Calculate maximum run length of <10 steps that *might* need binning
max_run <- max(rle(df$needs_binning)[[1]]) # lengths part of list
max_run # 3
#> [1] 3
# From dplyr::across() help examples -----
multilag <- function(x, lags = 1:max_run) {
names(lags) <- as.character(lags)
purrr::map_dfr(lags, lag, x = x)
}
#multilag(df$counts)
df %>%
mutate(across(starts_with("counts"), multilag, .unpack=TRUE)) %>%
mutate(across(starts_with("counts_"),
~ ifelse(. - counts < 10, TRUE, FALSE),
.names = "{.col}_bin")) %>%
filter(!if_any(ends_with("_bin"))) -> df2
head(df2)
#> time counts previous step needs_binning counts_1 counts_2 counts_3
#> 1 26 895 908 13 FALSE 908 910 928
#> 2 41 880 890 10 FALSE 890 895 908
#> 3 43 854 880 26 FALSE 880 890 895
#> 4 69 818 847 29 FALSE 847 854 880
#> 5 72 774 818 44 FALSE 818 847 854
#> 6 76 755 774 19 FALSE 774 818 847
#> counts_1_bin counts_2_bin counts_3_bin
#> 1 FALSE FALSE FALSE
#> 2 FALSE FALSE FALSE
#> 3 FALSE FALSE FALSE
#> 4 FALSE FALSE FALSE
#> 5 FALSE FALSE FALSE
#> 6 FALSE FALSE FALSE
range(df2$step, na.rm=TRUE)
#> [1] 10 61
plot(x=df2$time, y=df2$counts, type = "S")
创建于 2024-05-20,使用 reprex v2.1.0