如何以非均匀方式更改时间与计数图的垃圾箱

问题描述 投票:0回答:1

我在 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 中完成,但结果很干燥。

感谢您的任何帮助,谢谢!

r ggplot2 time aggregate
1个回答
0
投票

不知道等了这么久你这个问题解决了吗? 简单的解决方案是计算所有步长,然后删除所有步长 < 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

© www.soinside.com 2019 - 2024. All rights reserved.