【发布时间】:2018-06-18 18:36:03
【问题描述】:
我有 4 个数据框,每个数据框对应一个年份。 每个数据框包含五个位置的每日降雨量。
生成样本数据
location <- c("A","B","C","D","E")
mat <- round(as.data.frame(matrix(runif(1825),nrow=5,ncol=365)), digits=2)
dat.1981 <-as.data.frame(cbind(location,mat)) # rainfall for 1981
dat.1981$year <- 1981
mat <- round(as.data.frame(matrix(runif(1825),nrow=5,ncol=365)), digits = 2)
dat.1982 <- as.data.frame(cbind(location,mat)) # rainfall for 1982
dat.1982$year <- 1982
mat <- round(as.data.frame(matrix(runif(1825),nrow=5,ncol=365)), digits = 2)
dat.1983 <-as.data.frame(cbind(location,mat)) # rainfall for 1983
dat.1983$year <- 1983
mat <- round(as.data.frame(matrix(runif(1825),nrow=5,ncol=365)), digits = 2)
dat.1984 <-as.data.frame(cbind(location,mat)) # rainfall for 1984
dat.1984$year <- 1984
dat <- as.data.frame(rbind(dat.1981,dat.1982,dat.1983,dat.1984))
对于每一年,我想对某一天是否是极端潮湿的一天进行分类
我的计算方法如下:
1) 对于每个位置,生成 1981 年至 1984 年期间每周的平均降雨量和标准差。 例如,在位置 A,第一周的平均降雨量为:
(A 区 1981 年第一周降雨 + A 区 1982 年第一周降雨 + A 区 1983 年第一周降雨 + A 区 1984 年第一周降雨)/4
在R中可以写成
mean.week1.loc1 <- mean(rowSums(dat[dat$location=="A",2:8])) # 2:8 selects the first 7 days in each year
sd.week1.loc1 <- sd(rowSums(dat[dat$location=="A",2:8]))
wet.cr <- mean.week1 + sd.week1 # this is my threshold for defining a wet day
如果位置 A 1981 年至 1984 年第 1 周的每日降雨量大于wet.cr,
那一天是潮湿的一天,因此得到的值为 1
例如,要检查 1981 年至 1984 年位置 A 的第 1 周降雨是否是雨天,我可以执行以下操作:
lapply(dat[, 2:8], function(x) ifelse(x > wet.cr, 1, 0))
我想在每周和每个地点重复此操作。
但是,我无法将这些单独的功能拼接在一起,而且
我的最终结果应该是与dat 相同的数据框,但不是降雨值,而是用 1 或 0 来定义是否是潮湿的一天。
编辑
下面的解决方案给了我以下信息:
mean(c(rainfall 1981 day 1 week 1, ...., rainfall 1981 day 7 week 1, rainfall 1982 day 1 week 1,....,rainfall 1982 day 7 week 1,....,rainfall 1984 day 1 week 1,....,rainfall 1984 day 7 week 1))
我想要什么:
mean(c(mean(total rainfall week 1 1981), mean(total rainfall week 1 1982), mean(total rainfall week 1 1983), mean(total rainfall week 1 1984)))
我希望现在清楚了。
【问题讨论】:
-
这似乎比它需要的更难。如果您有所有日期,请使用
ISOweek获取年份和星期,然后在tidyr中汇总年份。如果您举一个包含完整日期而不是按周细分的数据示例,我可以向您展示.... -
我怀疑这种数据是否如图所示存储,因为并非每年都有 365 天。如果您有日期,您可以将它们转换为长,添加一个表示一年中的一周的列,按该列分组并获得平均值和标准差,您可以将其与值进行比较......数据是否如我预期的那样存在真的如图所示?
-
值得注意的是,1984 年有 366 天。您的数据框中缺少哪一项?
-
我删除了闰年多余的天数,这样所有年份都有相同的 365 天
-
@Tino 这就是我拥有数据的方式。我可以尝试按照您建议的方式对其进行操作。