R 如何计算跨越两年(10月至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

我正在为一篇可能的论文研究风向数据。我试图比较东风吹负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   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()
  )