R 如何计算跨越两年(10月至3月)的南方夏季的正风向值和负风向值的数量
我正在为一篇可能的论文研究风向数据。我试图比较东风吹负U的天数和西风吹正U的天数。我需要计算南方夏季的天数,因此10月和3月之间的时间段,例如:1993年10月到1994年3月 以下是我的数据框示例:R 如何计算跨越两年(10月至3月)的南方夏季的正风向值和负风向值的数量,r,dplyr,R,Dplyr,我正在为一篇可能的论文研究风向数据。我试图比较东风吹负U的天数和西风吹正U的天数。我需要计算南方夏季的天数,因此10月和3月之间的时间段,例如:1993年10月到1994年3月 以下是我的数据框示例: Year Month Day Hour Minutes Seconds Ws U V 1 1993 1 1 0 0 0 3.750620 2.822403 1.281318 2 1993 1
Year Month Day Hour Minutes Seconds Ws U V
1 1993 1 1 0 0 0 3.750620 2.822403 1.281318
2 1993 1 1 6 0 0 4.207054 3.600465 1.719147
3 1993 1 1 12 0 0 5.050543 3.155271 3.243411
4 1993 1 1 18 0 0 3.165194 -0.477054 2.926124
5 1993 1 2 0 0 0 1.529690 -0.721395 -0.503101
6 1993 1 2 6 0 0 1.950233 0.303333 -1.728295
7 1993 1 2 12 0 0 4.548992 -2.868217 3.307519
8 1993 1 2 18 0 0 6.563643 -6.245194 1.744419
9 1993 1 3 0 0 0 5.868992 -5.805969 -0.594031
10 1993 1 3 6 0 0 6.530620 -6.446667 -0.689535
11 1993 1 3 12 0 0 7.085736 -6.657984 1.834884
12 1993 1 3 18 0 0 7.685349 -7.111008 2.571783
13 1993 1 4 0 0 0 6.508760 -6.414574 -0.678837
14 1993 1 4 6 0 0 6.141860 -6.006822 -0.272558
15 1993 1 4 12 0 0 7.388295 -6.744574 1.862868
16 1993 1 4 18 0 0 7.281163 -7.054264 0.896512
17 1993 1 5 0 0 0 4.847287 -4.431628 -0.813643
18 1993 1 5 6 0 0 3.482558 -1.670078 2.048915
19 1993 1 5 12 0 0 5.698992 1.097287 5.433721
20 1993 1 5 18 0 0 4.894031 1.445736 4.440465
21 1993 1 6 0 0 0 1.983411 0.783023 1.556047
22 1993 1 6 6 0 0 2.315891 -1.225891 1.756744
23 1993 1 6 12 0 0 4.525581 -4.016124 1.723721
24 1993 1 6 18 0 0 5.123566 -4.618682 0.759225
25 1993 1 7 0 0 0 3.449147 -2.639457 -1.627442
26 1993 1 7 6 0 0 2.067364 1.185891 -0.760233
27 1993 1 7 12 0 0 5.675814 3.872171 3.419690
28 1993 1 7 18 0 0 6.278450 3.989767 4.684031
29 1993 1 8 0 0 0 6.562636 5.496667 3.329302
30 1993 1 8 6 0 0 7.762636 5.280310 5.516589
31 1993 1 8 12 0 0 9.283953 5.575659 7.294264
>
到目前为止,我已经设法进行了一个月的计算,只看到下面的代码,但我不确定如何从一年的10月到明年的3月进行计算。当我尝试filterwind,Year==1993:1994,Month==10:3,U>0时,我收到了错误警告消息:
月份==10:3:
较长的对象长度不是较短对象长度的倍数
这就是我到目前为止在计算1993年10月的积极和消极方向的数量方面所做的工作,这是行之有效的。我不熟悉R和stackoverflow,所以我希望我已经正确地阐述了这一点
filter(wind,Year==1993,Month==10,U>0)
Oct_1993_pos<-filter(wind,Year==1993,Month==10,U>0)
Oct_1993_pos
filter(wind,Year==1993,Month==10,U<0)
Oct_1993_neg<-filter(wind,Year==1993,Month==10,U<0)
Oct_1993_neg
sum(Oct_1993_pos$U>0)
sum(Oct_1993_neg$U<0)
发生第一个错误月份==10:3,因为您正在将一个向量月份与另一个向量月份进行比较。执行此操作时,您将执行元素级比较,即月[1]==10,月[2]==9,等等。当向量长度不相等时,R重复较短的一个-但仅当较长的一个是较长的确切倍数时:
c(1,2,3,1,2,3) == c(1,2)
[1] TRUE TRUE FALSE FALSE FALSE FALSE
c(1,2,3,1,2) == c(1,2)
[1] TRUE TRUE FALSE FALSE FALSE
Warning message:
In c(1, 2, 3, 1, 2) == c(1, 2) :
longer object length is not a multiple of shorter object length
为了计算正U和负U,您可以利用求和逻辑只计算真的数量:
sum(c(FALSE, TRUE, TRUE, FALSE))
[1] 2
您可以通过简单的比较来获得这些逻辑:
sum(U > 0)
对于您的计算,我建议使用dplyr。有了它,您可以在任何子集集合中重复计数。尝试:
# if following fails, run install.packages("dplyr")
library(dplyr)
monthly <- wind %>% group_by(Year, Month) %>%
summarise(
pos=sum(U > 0),
neg=sum(U < 0),
nowind=sum(U == 0),
entries=n()
)
通过这种方法,我们将问题分为两部分:1定义您希望总结的季节,2总结它
inner_join(wind, seasons, by=c('Year'='year','Month'='month')) %>%
group_by(season) %>%
summarise(
seasonstart = paste0(min(Year), '-', min(Month)),
pos=sum(U > 0),
neg=sum(U < 0),
nowind=sum(U == 0),
entries=n()
)
因此,总结10月至3月期间,与之前一样,只需定义一个不同的分组
对于练习,请尝试在上一个示例中通过调用将年和/或月添加到组中。请添加筛选函数的来源。另外,请使用dputheaddf,n.提供您的数据样本。请参见group_by和Summary表单dplyr@NelsonGon过滤功能来自dplyr。一旦我知道如何-道歉,我将提供我的数据样本。@NelsonGon我设法添加了我的数据样本,我希望这会有帮助。@Grumble先生谢谢你的帮助。我还有一个问题,你会建议我如何将10月到3月的正值和负值相加?
wind %>% filter((Month => 10 & Year == 1993) | (Month <= 3 & Year == 1994)) %>%
summarise(
pos=sum(U > 0),
neg=sum(U < 0),
nowind=sum(U == 0),
entries=n()
)
library(tidyr)
seasons <- crossing(month=1:12, year=1992:1994) %>% arrange(year, month) %>%
mutate(
season_start = month %in% c(3, 10),
season = cumsum(season_start)
)
inner_join(wind, seasons, by=c('Year'='year','Month'='month')) %>%
group_by(season) %>%
summarise(
seasonstart = paste0(min(Year), '-', min(Month)),
pos=sum(U > 0),
neg=sum(U < 0),
nowind=sum(U == 0),
entries=n()
)