【问题标题】:How to find the max,min value for specific season per year of a column in an array in R?如何在R中的数组中找到特定季节的最大值,最小值?
【发布时间】:2017-01-22 16:32:14
【问题描述】:

我有以下数组,我称之为站:

A1 <- matrix(runif(120),24,5)
A1[1:12,1]<-2012
A1[13:24,1]<-2013
A1[1:12,2]<-(1:12)
A1[13:24,2]<-(1:12)
A1[1:12,3]<-seq(1,24,by=2)
A1[13:24,3]<-seq(1,24,by=2)

A2 <- matrix(runif(120),24,5)
A2[1:12,1]<-2012
A2[13:24,1]<-2013
A2[1:12,2]<-(1:12)
A2[13:24,2]<-(1:12)
A2[1:12,3]<-seq(1,24,by=2)
A2[13:24,3]<-seq(1,24,by=2)

station <- array(NA,c(24,5,2))
station[,,1] <- A1
station[,,2] <- A2
dimnames(station)[[2]]<-c('year','month','day','win_3','win_7')
dimnames(station)[[3]]<-c('station1','station2')
print(station)

我想提取 win_3 的最大值,我称之为 Max_3Days 通过每个站每年春季(即 3,4 和 5 月份),并指定相应的日期和月份值(3,4 或5).

最小值也是一样的,我想从 win_7 中提取它,我在每个站每年夏季(即 6,7 和 8 月)调用 Min_7Days 并指定相应的月份值(6 ,7 或 8) 和日期

如果可能,我希望将结果保留为 数组格式

结果应该是这样的:

, , 1
                   Year Month day   Max_3Days   Year    Month  Day Min_7Days
  [1,]              2012     3   15      2800     2012      6    1       400
  [2,]              2013     4   2       2730     2013      6    4       100        

, , 2
                   Year Month day   Max_3Days   Year    Month  Day Min_7Days 
  [1,]              2012     4   15      2800     2012      7    10      250
  [2,]              2013     5   2       2750     2013      7    14      271        

当我只有一个站作为数据框格式时,我确实指定了春季和夏季并找到了最大值、最小值,我想以数组格式的(矩阵)对大约 70 个站执行此操作,并且我想将结果保存在一个数组中:

如果是数据帧(只有一个站):

Summer<-station[which(station$month>"5"&station$month<"9"),]
Minima<-ddply(Summer, ~ year, summarise, month=month[which.min(win_7)],day=day[which.min(win_7)], Min_7Days =min(win_7, na.rm = TRUE))

Spring<-station[which(station$month>"2"&station$month<"6"),]
Maxima<-ddply(Spring, ~ year, summarise, month=month[which.max(win_3)],day=day[which.max(win_3)], Max_3Days =max(win_3, na.rm = TRUE))

任何建议将不胜感激!

【问题讨论】:

  • 请使用dput显示示例数据集
  • 我更新了我的问题,很抱歉造成混乱
  • @NuhaJ.Alhowramy 你能重新确认共享的预期输出值吗?最大值是多少?
  • @joel.wilson: 以千为单位的最大值没有问题,但是月份值是 NA 因为每个月在实际数据中重复 30 次(根据天数)例如:月:1,1,1,1,1,1,1,1,1 然后 2,2,2,2,2,2,2,3,3,3,3,3,3,... 。 等等。我尝试了很多东西,对我没有用:(
  • @NuhaJ.Alhowramy 这不应该造成问题..你检查我的号码了吗?它给出了结果

标签: arrays r plyr


【解决方案1】:

目前我已将它们设为list 并继续。

l = vector('list', 2)
l[[1]] = data.frame(station[,,1])
l[[2]] = data.frame(station[,,2])

spring_end   <- 5
spring_start <- 3
summer_end   <- 8
summer_start <- 6

library(dplyr)
func <- function(df){

  df %>% group_by(year) %>% 
         summarise(   Max_3Days    = max(win_3[between(month, spring_start, spring_end)]),
                      Month_spring = month[between(month, spring_start, spring_end)][which.max(win_3[between(month, spring_start, spring_end)])],
                      Min_7Days    = min(win_7[between(month, summer_start, summer_end)]),
                      Month_summer = month[between(month, summer_start, summer_end)][which.min(win_7[between(month, summer_start, summer_end)])])
}

lapply(l, func)

#[[1]]
#   year Max_3Days Month_spring Min_7Days Month_summer
#1  2012 0.6521762            5 0.3547476            6
#2  2013 0.9627131            3 0.1754293            6

#[[2]]
#   year Max_3Days Month_spring  Min_7Days Month_summer
#1  2012 0.6115331            5 0.08505264            6
#2  2013 0.6051239            3 0.10938192            8

【讨论】:

  • 我有一个数组格式,结果应该还是数组格式,我更新我的问题看看我的实际数组,非常感谢。
  • 在指定包含三个月的季节后,我想查看 min 或 max 的值出现在哪个月份。
  • 我又重新整理了一下资料,希望这次能有所帮助:)
  • :+1 如果没有与示例数据完全相同的重复月份值,您的答案是有效的。谢谢
  • 成功了!我不知道该说什么,非常感谢你:)
猜你喜欢
  • 2018-06-19
  • 2021-02-10
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2012-12-28
  • 1970-01-01
  • 2019-08-21
相关资源
最近更新 更多