在dplyr中运行函数会产生错误的输出
我的样本数据包括1981年和1982年从第1天到365天的每日降雨量和温度在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
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