【问题标题】:How to filter dataframe for consecutively increasing values如何过滤数据框以获取连续增加的值
【发布时间】:2020-12-03 06:38:20
【问题描述】:

我有一个包含几列的大型数据框,但对于这个查询,我对 3 列感兴趣。

df <- structure(list(country = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "ireland", class = "factor"), 
    parameter = structure(c(2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L,2L, 1L, 3L), .Label = c("rainfall", "temp", "wind"), class = "factor"), 
    value = c(10L, 15L, 20L, 9L, 18L, 10L, 12L, 25L, 15L, 10L, 10L, 20L), unit = structure(c(3L, 2L, 1L, 3L, 2L, 1L, 3L, 
    2L, 1L, 3L, 2L, 1L), .Label = c("km/hr", "mm", "oC"), class = "factor")), class = "data.frame", row.names = c(NA, -12L))

country parameter   value   unit
ireland temp          10    oC
ireland rainfall      15    mm
ireland wind          20    km/hr
ireland temp           9    oC
ireland rainfall      18    mm
ireland wind          10    km/hr
ireland temp          12    oC
ireland rainfall      25    mm
ireland wind          15    km/hr
ireland temp          10    oC
ireland rainfall      10    mm
ireland wind          20    km/hr

我想按国家和参数分组以提取 value 列连续增加 3 倍或更多的行。

欲望输出示例。

country parameter   value   unit
ireland rainfall      15    mm
ireland rainfall      18    mm
ireland rainfall      25    mm
ireland wind          10    km/hr
ireland wind          15    km/hr
ireland wind          20    km/hr

【问题讨论】:

  • diff() 提供列表中一个值与下一个值之间的差异。也许检查diff(df) &gt; 3?在你sort(df, decreasing=TRUE)之后,当然。
  • 为什么你有wind last 20?有两个 20 值,因此差异为零。那里有 20 个是正确的吗?

标签: r dataframe dplyr


【解决方案1】:

这是使用dplyr的解决方案

df %>%
  arrange(value,decreasing = FALSE) %>% # Arrange by value
  filter(lag(value) > 3) # And filter for a difference above 3 in value

df
   country parameter value  unit
1  ireland      temp    10    oC
2  ireland      wind    10 km/hr
3  ireland      temp    10    oC
4  ireland  rainfall    10    mm
5  ireland      temp    12    oC
6  ireland  rainfall    15    mm
7  ireland      wind    15 km/hr
8  ireland  rainfall    18    mm
9  ireland      wind    20 km/hr
10 ireland      wind    20 km/hr
11 ireland  rainfall    25    mm

【讨论】:

    【解决方案2】:
    df %>% 
      group_by(country, parameter) %>% 
      mutate(
        flag = c(0, diff(value)) > 0,
        flag_lag = lead(flag),
        seq_end = flag == TRUE & flag_lag %in% c(NA, FALSE),
        seq_begin = flag == FALSE & flag_lag == TRUE,
      ) %>%
      slice(if(length(which(seq_begin == TRUE):which(seq_end == TRUE)) >= 3) which(seq_begin == TRUE):which(seq_end == TRUE) else NA) %>%
      select(-contains("flag"), -contains("seq"))
    

    【讨论】:

    • lag()mutate 更友好,因为您不必手动分配第一个值。
    【解决方案3】:

    您可以按国家和参数分组,他们为不小于滞后值的值创建第三个分组变量,然后过滤组大小为 3 或更大:

    library(dplyr)
    
    df %>%
      group_by(country, parameter) %>%
      group_by(x = cumsum(value <= lag(value, default = FALSE)), .add = TRUE) %>%
      filter(n() >= 3) %>%
      ungroup() %>%
      arrange(country, parameter) %>%
      select(-x)
    
    # A tibble: 6 x 4
      country parameter value unit 
      <fct>   <fct>     <int> <fct>
    1 ireland rainfall     15 mm   
    2 ireland rainfall     18 mm   
    3 ireland rainfall     25 mm   
    4 ireland wind         10 km/hr
    5 ireland wind         15 km/hr
    6 ireland wind         20 km/hr
    

    【讨论】:

    • 这看起来不错,但它对我的实际数据框无法正常工作,我不知道为什么。我尝试将我的列转换为因子和整数。通过组合使用不同的列组。我什至只是将它带回按参数分组。返回的结果包括连续增加后的下降。
    • 在国家和参数组内,它将返回 3 个或更多连续递增值的所有实例。你只想要第一组这些值吗?从您的帖子中不清楚。
    • 如果值不断增加,是的。如果有下降,我不想报告。我想要像 1,2,3,4,5 而不是 1,2,3,1,1,2,1 的值。希望这更有意义。
    • 是的,但是 1,2,3,1,2,3,4,1,2 怎么样 - 在这种情况下您希望返回什么?你想要 1,2,3 因为它是第一组连续递增的值,还是想要 1,2,3,4 因为它是最长的,还是两者兼而有之?
    • 两者。但在当前的形式中,我得到:(直接从我的 df 中的输出)7,16,30,10,1,7,13,15,30...... 10 应该已经过滤掉了?
    【解决方案4】:

    这是使用subset + ave + rle 的基本 R 选项

    subset(
      df[with(df,order(country, parameter)), ],
      !!ave(value, country, parameter, FUN = function(x) with(rle(cumsum(c(1, diff(x) <= 0))), rep(lengths >= 3, lengths)))
    )
    

    给了

       country parameter value  unit
    2  ireland  rainfall    15    mm
    5  ireland  rainfall    18    mm
    8  ireland  rainfall    25    mm
    6  ireland      wind    10 km/hr
    9  ireland      wind    15 km/hr
    12 ireland      wind    20 km/hr
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2021-11-04
      • 2022-01-08
      • 2012-12-20
      相关资源
      最近更新 更多