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

在dplyr中运行函数会产生错误的输出,r,function,dplyr,R,Function,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 = sam

我的样本数据包括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
和相应的
doy.first
doy.second
并从
ref.doy:doy.first
doy.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)
  }

如果您想在函数中使用这样的函数,那么:

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
库(dplyr)
乐趣%(年份,参考年份)%>%

总结(tot.rain.val1=sum(rain[doy>=ref.doy&doy=doy.first&doy=ref.doy&doy=doy.first&doy如果您想在函数中使用这样的内容,那么如何处理:

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
库(dplyr)
乐趣%(年份,参考年份)%>%

summary(tot.rain.val1=sum(rain[doy>=ref.doy&doy=doy.first&doy=ref.doy&doy=doy.first&doy您的函数以您想要的格式返回一个数据帧,因此您不需要使用
粘贴
,而是将这些输出保存在一个列表中,然后
unest

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
库(tidyverse)
df%左加入(my.df)
df%>%
分组依据(年份,参考年份)%>%
总结(结果=列表(my.func(.))%>%
unest()%>%
解组()%>%
选择(-year,-ref.doy)
##tibble:16 x 6
#第1年参考doy1 tot.rain.val1 tot.rain.val2 mean.tmax.val1 mean.tmax.val2
#                                              
# 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

您的函数以您想要的格式返回数据帧,因此您不需要使用
粘贴
,而是将这些输出保存在列表中,然后
取消最新

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
库(tidyverse)
df%左加入(my.df)
df%>%
分组依据(年份,参考年份)%>%
总结(结果=列表(my.func(.))%>%
unest()%>%
解组()%>%
选择(-year,-ref.doy)
##tibble:16 x 6
#第1年参考doy1 tot.rain.val1 tot.rain.val2 mean.tmax.val1 mean.tmax.val2
#                                              
# 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

试试这个
df%%>%dplyr::group_by(year,ref.doy)%%>%dplyr::summary(results=list(my.func())%%>%unnest()
这个
unnest
函数非常有用。谢谢你的帮助。很高兴接受这个答案我已经把我的评论作为一个解决方案发布了,但我认为@s_t提供的解决方案也很好:)试试这个
df%%>%dplyr::group_by(year,ref.doy)%%>%dplyr::summary(results=list(my.func())%%>%unest()
这个
unest
函数非常有用。谢谢你的帮助。很高兴接受这个答案我已经把我的评论作为一个解决方案发布了,但我认为@s_t提供的解决方案也很好:)我认为您的解决方案给出了所需的结果并更正了原始代码,+1应得。我认为您的解决方案给出了所需的结果并更正了原始代码,+1应得。
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