【问题标题】:Finding the range based on minimum values that increases根据增加的最小值查找范围
【发布时间】:2020-10-07 05:29:09
【问题描述】:

我有一个包含多个站点、深度和浓度的数据集。我试图根据最小浓度增加 0.1 的位置找到深度(或厚度)的差异

例如:在1号站,最大深度为14m。在 4m 处有 0.1 的浓度,在 6m 处增加到 0.2。但随后它在 10m 处再次下降到 0.1,并一直保持这种状态,直到 12m 才增加。它在 13m 处仅增加 0.05。在14m处,浓度增加0.1。所以 14m 是找到最低浓度的最深(或最大深度)。我需要找到一种方法来修复我的代码以找到 14...(即浓度增加 0.1)。我可以找到给定站点的最大深度和最小浓度。

此代码为我提供了每个站点的最大深度 (max_depth) 列和每个站点的最小浓度 (min_conc) 的另一列。

我如何找到最低浓度增加 0.1 的深度?

我正在尝试使用“哪个”最大值和最小值,但我无法弄清楚代码..How to use Dplyr's Summarize and which() to lookup min/max values

station <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4)
depth <- c(1, 2, 3, 6, 8, 9, 10, 11, 12, 13, 14, 1, 3, 4, 6, 8, 10, 11, 14, 1, 2, 4, 6, 8, 9, 10, 15, 18, 20, 1, 2, 4, 6, 8, 10, 11)
conc <- c(0.4, 0.4, 0.3, 0.1, 0.2, NA, 0.2, 0.1, 0.1, 0.1, 0.15, 0.2, 0.5, 0.4, 0.3, 0.6, 0.4, 0.2, 0.1, 0.2, 0.3, 0.2, 0.5, 0.5, 0.3, 0.2, 0.1, 0.2, 0.2, 0.2, 0.8, 0.6, 0.4, 0.3, 0.2, 0.3, 0.3)

df <- cbind(station, depth, conc)
(df <- as.data.frame(df))          

(depth <- df %>% 
 group_by(station) %>%
 summarize(
Max_depth=miss(max(depth)),
min_conc=miss(min(conc, na.rm=TRUE)),
press_depth = depth[tail(which(conc == min(conc, na.rm = TRUE)), 1)]))

当我尝试这样做时:

 press_depth = depth[tail(which(conc == min(conc > 0.1, na.rm = TRUE)), 1)])

我收到一个错误:列 press_depth 的长度必须为 1(汇总值),而不是 0

【问题讨论】:

    标签: r function dplyr summarize


    【解决方案1】:

    我不确定我是否完全理解您的要求,但希望这可以帮助您开始。如果与您的想法不同,请告诉我:

    library(dplyr)
    
    df <- data_frame(
      station = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4),
      depth = c(1, 2, 4, 6, 8, 9, 10, 11, 12, 13, 14, 1, 3, 4, 6, 8, 10, 11, 14, 1, 2, 4, 6, 8, 9, 10, 15, 18, 20, 1, 2, 4, 6, 8, 10, 11),
      conc = c(0.4, 0.6, 0.3, 0.2, 0.2, NA, 0.2, 0.2, 0.2, 0.1, 0.2, 0.5, 0.4, 0.3, 0.6, 0.4, 0.2, 0.1, 0.2, 0.3, 0.2, 0.5, 0.5, 0.3, 0.2, 0.1, 0.2, 0.2, 0.2, 0.8, 0.6, 0.4, 0.3, 0.2, 0.3, 0.3)
      )
    
    df %>% 
      group_by(station) %>% 
      mutate(conc_diff = lead(conc) - conc,
             dept_diff = lead(depth) - depth) %>% 
      filter(conc_diff == .1, conc == min(conc, na.rm = TRUE)) %>% 
      filter(depth == max(depth))
    #> # A tibble: 3 x 5
    #> # Groups:   station [3]
    #>   station depth  conc conc_diff dept_diff
    #>     <dbl> <dbl> <dbl>     <dbl>     <dbl>
    #> 1       1    13   0.1       0.1         1
    #> 2       2    11   0.1       0.1         3
    #> 3       3    10   0.1       0.1         5
    

    reprex package (v0.3.0) 于 2020 年 6 月 17 日创建

    【讨论】:

    • 领导是做什么的?假设 0.2 是最低浓度,那么可能有多个深度出现 0.2。我需要找到 0.2 最深的位置。我试图关注一篇文章,上面写着“此处定义为 conc +0.1 深度和轮廓底部深度之间的距离”
    • lead(x) '向前看'列。 conc_diff = lead(conc) - concconc 在每个深度的差异。没有完整的例子很难理解。我正在更新答案,反映我认为我理解的内容
    • 不知何故它不适用于我的代码。我收到错误因子site 包含隐式 NA,请考虑使用forcats::fct_explicit_na。我尝试更新上面的代码以更好地反映问题(我希望如此)。在站点 1,有 11 个深度,范围从 1m 到 14m。最低浓度为 0.1,出现在 6m、11、12 和 13m 深度,然后在 14m 处上升 0.1。我需要找到浓度最低的最大深度。在这种情况下,它是 13m。
    • site 列不在您共享的数据中,sry 无法帮助您。使用最新数据更新答案,显示它按您的要求工作
    • 更新了上面的主要问题。
    猜你喜欢
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2011-12-19
    • 2015-10-25
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多