首页 > 解决方案 > 在 dplyr 中运行函数会给出错误的输出

问题描述

我的样本数据包括 1981 年和 1982 年从第 1 天到第 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,对于每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.firstdoy.second并计算总降雨量和平均温度 ref.doy:doy.firstdoy.first:doy.second`。我写了一个函数来做到这一点:

  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

标签: rfunctiondplyr

解决方案


如果你想在一个函数中使用这样的东西呢:

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

推荐阅读