【问题标题】:For a specified value in one column, find magnitude of change in values in another, for each ID对于一列中的指定值,查找另一列中值的变化幅度,对于每个 ID
【发布时间】:2021-07-31 18:43:41
【问题描述】:

如果我有一个看起来像这样的数据框:

  df <- data.frame(
  NestID = c(rep("LB1_2014", 9), rep("LB2_2014", 2)),
  Datetime = seq(from = ymd_hms("2014-04-02 05:00:00"), to = ymd_hms("2014-04-02 15:00:00"), by = "1 hour"),
  Temp = c(29.083, 29.200, 28.536, 28.221, 27.934, 28.417, 28.942, 29.323, 29.42, 28.93, 28.28),
  Flooded = c(rep(FALSE, 2), TRUE, rep(FALSE, 8)))

   > df
     NestID            Datetime   Temp Flooded
1  LB1_2014 2014-04-02 05:00:00 29.083   FALSE
2  LB1_2014 2014-04-02 06:00:00 29.200   FALSE
3  LB1_2014 2014-04-02 07:00:00 28.536    TRUE
4  LB1_2014 2014-04-02 08:00:00 28.221   FALSE
5  LB1_2014 2014-04-02 09:00:00 27.934   FALSE
6  LB1_2014 2014-04-02 10:00:00 28.417   FALSE
7  LB1_2014 2014-04-02 11:00:00 28.942   FALSE
8  LB1_2014 2014-04-02 12:00:00 29.323   FALSE
9  LB1_2014 2014-04-02 13:00:00 29.420   FALSE
10 LB2_2014 2014-04-02 14:00:00 28.930   FALSE
11 LB2_2014 2014-04-02 15:00:00 28.280   FALSE

我想找出每个 NestID 的第一次降温幅度。

所以在 Flooded == TRUE 之后,

上一行的 Temp 是 TempBefore

然后找到在 Temp 再次上升到 TempBefore 之前达到的最低 Temp。

(Flooded == TRUE 只是确认温度下降的最小值。)

幅度 = TempBefore - MinTemp

我有代码的开头和(我认为!)结尾,我希望它只是缺少一两行。

我正在寻找的输出是每个 NestID 和 Magnitude 的一行。如果 Flooded != TRUE,则表示幅度 NA。

对于这个示例数据,我想要的输出是:

TempBefore = 29.200, 最小温度 = 27.934

因此

     NestID  Magnitude
1  LB1_2014      1.266
2  LB2_2014         NA

(可能有多个 Flooded 事件,但为简单起见,我只寻找第一个 Flooded == TRUE 事件的大小。)

FloodingMagnitude = group_by (df, NestID) %>% 
    mutate(TempBefore = if_else(Flooded == TRUE, 
                        lag(Temp, default = first(Temp)), as.double(NA))) %>%

    # line of code I need to work:
    mutate(MinTemp = min(Temp) before it reaches TempBefore again) %>% 
    
    mutate(Magnitude = TempBefore - MinTemp) %>% 
    distinct(NestID, Magnitude)

【问题讨论】:

  • @RonakShah 谢谢!我已经更新了我的问题。我希望能澄清它。
  • 您能为您的示例数据添加最终数据框吗?
  • @RonakShah 我在上面添加了 BeforeTemp 和 MinTemp。对不起!
  • 我现在已经更新了文本和数据。我想我以前把人弄糊涂了。 Flooded == TRUE 由最小值 Temp drop 触发。在事件范围内它不会保持 TRUE。

标签: r magnitude


【解决方案1】:

也许这会有所帮助 -

library(dplyr)

df %>%
  filter(Flooded | lead(Flooded)) %>%
  group_by(NestID, Flooded = data.table::rleid(Flooded)) %>%
  slice(n()) %>%
  group_by(NestID) %>%
  summarise(Magnitude = Temp - lead(Temp), .groups = 'drop')

#  NestID   Magnitude
#  <chr>        <dbl>
#1 LB1_2014      1.56
#2 LB1_2014     NA   

【讨论】:

  • 谢谢,但没有。在这种情况下,最小 Temp 恰好是下一个值,但在我的实际数据集中可能是 6 小时或 24 小时后。除非我误解了你的代码。我是新手!
猜你喜欢
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 2016-05-06
  • 2018-04-02
相关资源
最近更新 更多