代码之家  ›  专栏  ›  技术社区  ›  89_Simple

在dplyr中运行函数会产生错误的输出

  •  0
  • 89_Simple  · 技术社区  · 6 年前

    我的样本数据包括1981年和1982年从第一天到365天的每日降雨量和温度

      set.seed(0)
      df <- data.frame(year = rep(1981:1982, each = 365),
                       doy = rep(1:365, times = 2), 
                       rainfall = sample(0:30, 730, replace = T), 
                       tmax = sample(25:35, 730, replace = T)) 
    

    每年我都有两天 ref.doy ,我有相应的 doy.first doy.second .

      my.df <- data.frame(year = c(1981, 1981, 1982, 1982),
                          ref.doy = c(250, 260, 230, 240),
                          doy.first = c(280, 300, 290, 310),
                          doy.second = c(310, 330, 340, 350))
    

    我想做的是每年第一次 以及相应的 先打瞌睡 , 好的。第二 计算总降雨量和平均气温 ref.doy:doy.first doy.first: 好的。第二`. 为此我编写了一个函数:

      my.func <- function(x) {
    
       dat <-  x %>% 
               dplyr::summarise(tot.rain.val1 = sum(rainfall[doy >= ref.doy & doy <= doy.first]),
                                tot.rain.val2 = sum(rainfall[doy >= doy.first & doy <= doy.second]),
                                mean.tmax.val1 = mean(tmax[doy >= ref.doy & doy <= doy.first]),
                                mean.tmax.val2 = sum(tmax[doy >= doy.first & doy <= doy.second]))
       return(dat)
      }
    

    我采用的方法是首先连接两个数据,然后运行我的函数

      df <- df %>% left_join(my.df)
    
      results <- df %>% dplyr::group_by(year, ref.doy) %>% 
                 dplyr::summarise(results = paste(my.func(.), collapse = ","))
    

    results 按以下格式

      year  ref.doy tot.rain.val1 tot.rain.val2 mean.tmax.val1 mean.tmax.val2
      1981   250              
      1981   260   
      1982   230
      1982   240
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   AntoniosK    6 年前

    函数以所需的格式返回数据帧,因此不需要使用 paste unnest .

    library(tidyverse)
    
    df <- df %>% left_join(my.df)
    
    df %>% 
      group_by(year, ref.doy) %>% 
      summarise(results = list(my.func(.))) %>% 
      unnest() %>%
      ungroup() %>%
      select(-year, -ref.doy)
    
    # # A tibble: 16 x 6
    #    year1 ref.doy1 tot.rain.val1 tot.rain.val2 mean.tmax.val1 mean.tmax.val2
    #    <dbl>    <dbl>         <int>         <int>          <dbl>          <int>
    # 1  1981      250           396           365           29.6            939
    # 2  1981      260           429           489           29.8            926
    # 3  1982      230           994           805           29.3           1515
    # 4  1982      240          1140           653           29.7           1224
    # 5  1981      250           396           365           29.6            939
    # 6  1981      260           429           489           29.8            926
    # 7  1982      230           994           805           29.3           1515
    # 8  1982      240          1140           653           29.7           1224
    # 9  1981      250           396           365           29.6            939
    #10  1981      260           429           489           29.8            926
    #11  1982      230           994           805           29.3           1515
    #12  1982      240          1140           653           29.7           1224
    #13  1981      250           396           365           29.6            939
    #14  1981      260           429           489           29.8            926
    #15  1982      230           994           805           29.3           1515
    #16  1982      240          1140           653           29.7           1224
    
        2
  •  2
  •   s__    6 年前

    像这样的东西呢,如果你想在函数中使用它:

    library(dplyr)
    fun <- function(x,y) {
    df1 <- x %>% left_join(y) %>% group_by(year,ref.doy) %>%
    summarise(tot.rain.val1 = sum(rainfall[doy >= ref.doy & doy <= doy.first]),
              tot.rain.val2 = sum(rainfall[doy >= doy.first & doy <= doy.second]),
              mean.tmax.val1 = mean(tmax[doy >= ref.doy & doy <= doy.first]),
              mean.tmax.val2 = sum(tmax[doy >= doy.first & doy <= doy.second]))
    print(df1)
    }
    
    fun(df,my.df)
    Joining, by = "year"
    # A tibble: 4 x 6
    # Groups:   year [?]
       year ref.doy tot.rain.val1 tot.rain.val2 mean.tmax.val1 mean.tmax.val2
      <dbl>   <dbl>         <int>         <int>          <dbl>          <int>
    1  1981     250           396           365           29.6            939
    2  1981     260           429           489           29.8            926
    3  1982     230           994           805           29.3           1515
    4  1982     240          1140           653           29.7           1224