r - 在 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.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)
}
我采取的方法是先加入两个数据,然后运行我的函数
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
解决方案
如果你想在一个函数中使用这样的东西呢:
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
推荐阅读
- ios - 谷歌登录与 Realm Swift 连接
- node.js - 如何使用nodejs在mongodb中查找和更新最新记录?
- node.js - 节点使用 html-pdf npm 返回 SIGSEGV 错误
- java - 如何从 Java 中的不同类返回对象?
- import - Powershell 6.2.3 无法导入 AzureAd 模块
- android - 如何在 Android Gradle 插件上的 R8Transform 之后添加新的 Transform?
- javascript - python烧瓶动态下拉列表
- swift - 如何使用蒙版对象使对象的背面不可见?
- firebase - 添加 firebase 设置后 React Native 构建失败
- python - 模块“app”pylint(模块中没有名称)中没有名称“路由”