【问题标题】:Extracting anomalous intervals from a data frame从数据框中提取异常间隔
【发布时间】:2020-04-16 05:33:04
【问题描述】:

我有一个大型数据集,我试图在其中提取 5+ 个连续单元格的 Anom 值 >1 的区间(从列区域),并计算每个区间的平均值。在下面的示例中,我想提取异常区间包括区域 = 5 到 11 和 17 到 26 的信息,但忽略 28 到 29(因为连续单元格的数量小于 5)。非常感谢任何帮助。

 df <-  data.frame("Zone" = 1:30, "Anom" = 1:30)
 df[,2] <- 0
 df[5:11,2] <- 1
 df[17:26,2] <- 1
 df[28:29,2] <- 1

df

   Zone Anom
1     1    0
2     2    0
3     3    0
4     4    0
5     5    1
6     6    1
7     7    1
8     8    1
9     9    1
10   10    1
11   11    1
12   12    0
13   13    0
14   14    0
15   15    0
16   16    0
17   17    1
18   18    1
19   19    1
20   20    1
21   21    1
22   22    1
23   23    1
24   24    1
25   25    1
26   26    1
27   27    0
28   28    1
29   29    1
30   30    0

我想要生成的输出类型

1 Zone.From Zone.To Anom.Mean
2 5         11      1
3 17        26      1

【问题讨论】:

    标签: r


    【解决方案1】:

    使用dplyrdata.tablerleid 的一种方法是为Anom 中的每个更改创建一个新组。对于每个组,获得Zonefirstlast 值、Anommean、其中的行数和Anomfirst 值。然后我们可以filter 并只保留那些我们有大于等于 5 行且Anom 大于 0 的组。

    library(dplyr)
    
    df %>%
      group_by(grp = data.table::rleid(Anom)) %>%
      summarise(Zone.From  = first(Zone), 
                Zone.To = last(Zone), 
                mean_anom = mean(Anom), 
                N = n(), 
                Anom = first(Anom)) %>%
      filter(Anom > 0 & N >= 5) %>%
      select(-c(grp, N, Anom))
    
    #  Zone.From Zone.To mean_anom
    #      <int>   <int>     <dbl>
    #1         5      11         1
    #2        17      26         1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 2019-05-18
      • 2021-12-27
      • 2012-07-19
      相关资源
      最近更新 更多