【问题标题】:R: Computing mean rows depending on date. tidyverseR:根据日期计算平均行数。 tidyverse
【发布时间】:2020-07-04 03:57:56
【问题描述】:

你们中的一些人通过基础 R 帮助解决了这个问题,但我现在正在尝试使用整洁的数据来解决这个问题。这是我的数据集:

data <- tibble( "DATE_FIRE"= c("1989-07-31", "1989-07-31", "1989-07-31", "1989-07-31","1989-07-31","1989-08-31", "1989-08-31", "1989-08-31", "1989-08-31","1989-08-31"), 
       "FID_FIRE" = c(1,1,1,1,1,2,2,2,2,2),
       "date" = c("1988-01-01", "1989-01-01","1990-01-01","1991-06-07","1992-01-01", "1988-01-01", "1989-01-01","1990-01-01","1991-06-07","1992-01-01"),
       "NDVI" = c( 0.9, 0.8, 0.1, 0.2, 0.3, 0.8, 0.85, 0.15, 0.30, 0.50))
> data
# A tibble: 10 x 4
   DATE_FIRE  FID_FIRE date        NDVI
   <chr>         <dbl> <chr>      <dbl>
 1 1989-07-31        1 1988-01-01  0.9 
 2 1989-07-31        1 1989-01-01  0.8 
 3 1989-07-31        1 1990-01-01  0.1 
 4 1989-07-31        1 1991-06-07  0.2 
 5 1989-07-31        1 1992-01-01  0.3 
 6 1989-08-31        2 1988-01-01  0.8 
 7 198`enter code here`9-08-31        2 1989-01-01  0.85
 8 1989-08-31        2 1990-01-01  0.15
 9 1989-08-31        2 1991-06-07  0.3 
10 1989-08-31        2 1992-01-01  0.5 

如您所见,我有 2 个森林地块的日期,即火灾 1 和火灾 2(FID_FIRE 列)。 DATE_FIRE 告诉我们每个地块发生火灾的时间我还有这些地块在火灾前后的NDVI(绿色参数)数据(参见列dateNDVI)。

我想为每个图添加一列计算NDVI在发生火灾之前平均值。在FID_FIRE=1 的情况下,它将是NDVIrow 12 的平均值。

输出应如下所示:

> desired_output
# A tibble: 10 x 5
   DATE_FIRE  FID_FIRE date        NDVI meanPrefire
   <chr>         <dbl> <chr>      <dbl>       <dbl>
 1 1989-07-31        1 1988-01-01  0.9        0.85 
 2 1989-07-31        1 1989-01-01  0.8        0.85 
 3 1989-07-31        1 1990-01-01  0.1        0.85 
 4 1989-07-31        1 1991-06-07  0.2        0.85 
 5 1989-07-31        1 1992-01-01  0.3        0.85 
 6 1989-08-31        2 1988-01-01  0.8        0.825
 7 1989-08-31        2 1989-01-01  0.85       0.825
 8 1989-08-31        2 1990-01-01  0.15       0.825
 9 1989-08-31        2 1991-06-07  0.3        0.825
10 1989-08-31        2 1992-01-01  0.5        0.825

【问题讨论】:

    标签: r tidyverse mean


    【解决方案1】:

    试试:

    library(dplyr)
    
    data %>%
      group_by(FID_FIRE) %>%
      mutate(meanPrefire = mean(NDVI[date < DATE_FIRE], na.rm = TRUE))
    

    输出:

    # A tibble: 10 x 5
    # Groups:   FID_FIRE [2]
       DATE_FIRE  FID_FIRE date        NDVI meanPrefire
       <chr>         <dbl> <chr>      <dbl>       <dbl>
     1 1989-07-31        1 1988-01-01  0.9        0.85 
     2 1989-07-31        1 1989-01-01  0.8        0.85 
     3 1989-07-31        1 1990-01-01  0.1        0.85 
     4 1989-07-31        1 1991-06-07  0.2        0.85 
     5 1989-07-31        1 1992-01-01  0.3        0.85 
     6 1989-08-31        2 1988-01-01  0.8        0.825
     7 1989-08-31        2 1989-01-01  0.85       0.825
     8 1989-08-31        2 1990-01-01  0.15       0.825
     9 1989-08-31        2 1991-06-07  0.3        0.825
    10 1989-08-31        2 1992-01-01  0.5        0.825
    

    【讨论】:

      【解决方案2】:

      我们可以使用data.table

      library(data.table)
      setDT(data)[, meanPrefire := mean(NDVI[date < DATE_FIRE], na.rm = TRUE), .(FID_FIRE)]
      

      【讨论】:

        猜你喜欢
        • 2020-06-05
        • 1970-01-01
        • 2021-12-29
        • 2023-03-18
        • 1970-01-01
        • 2013-09-11
        • 2016-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多