首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R-统计每个因子在特定范围内的日值数量,并按年汇总

R-统计每个因子在特定范围内的日值数量,并按年汇总
EN

Stack Overflow用户
提问于 2018-03-26 01:44:55
回答 4查看 196关注 0票数 4

我有每天的数据,我想统计一下每天的测量在一定范围内的次数。数据也是按因子分组的,因此我需要知道在某个范围内(例如15到18)的每个因子每年的天数

我有一个超过100年的大型数据集,但这里有一些仅用于此示例的数据:

代码语言:javascript
运行
复制
Date <- seq(as.Date("2010/01/01"), by = "day", length.out = 1095)
People <- sample.int(20, 1095, replace = TRUE)
Country <- sample(x = c("Australia", "Canada", "France"), size = 1095, replace = TRUE)

mydf <- data.frame(Date, People, Country)

我想知道每个国家每年"People“值在15到18之间的次数。

因此,我的输出将是一个新的数据帧,类似于:

代码语言:javascript
运行
复制
myDate    People    Country
2010      45        Australia
2010      10        Canada
2010      24        France
2011      33        Australia
2011      100       Canada
2011      4         France
2012      21        Australia
2012      66        Canada
2012      211       France

任何帮助都会非常感谢,因为我正在努力解决这个问题,并寻找了答案,但我找不到一个涉及日期和因素的解决方案。

EN

回答 4

Stack Overflow用户

发布于 2018-03-26 02:16:20

您可以使用lubridatedplyr实现这一点。使用year()根据年份和国家/地区获取年份和组。最后一步是条件总结:

代码语言:javascript
运行
复制
library(dplyr)
library(lubridate)

mydf %>%
  group_by(year = year(Date), Country) %>%
  summarise(p = sum(between(People, 15, 18)))

这可能会导致

代码语言:javascript
运行
复制
   year Country       p
  <dbl> <fct>     <int>
1 2010. Australia    22
2 2010. Canada       34
3 2010. France       26
4 2011. Australia    21
5 2011. Canada       30
6 2011. France       13
7 2012. Australia    28
8 2012. Canada       31
9 2012. France       23
票数 3
EN

Stack Overflow用户

发布于 2018-03-26 02:46:14

下面是必需的基本解决方案。要点:使用format.Date将日期转换为字符年份值,按分组需要是list-object:

代码语言:javascript
运行
复制
aggregate( mydf['People'], list(mydf[['Country']], format(mydf$Date, "%Y") ), 
                           FUN=function(d) sum( d >=15 & d <=18) )
    Group.1 Group.2 People
1 Australia    2010     25
2    Canada    2010     22
3    France    2010     24
4 Australia    2011     27
5    Canada    2011     19
6    France    2011     33
7 Australia    2012     19
8    Canada    2012     33
9    France    2012     24

如果您希望结果数据帧具有不同的列名,则将这些列名添加到按组定义中的列表中:

代码语言:javascript
运行
复制
 aggregate( mydf['People'], list(Cntry=mydf[['Country']], Yr=format(mydf$Date, "%Y") ), 
                function(d) sum( d >=15 & d <=18) )
      Cntry   Yr People
1 Australia 2010     25
2    Canada 2010     22
3    France 2010     24
4 Australia 2011     27
5    Canada 2011     19
6    France 2011     33
7 Australia 2012     19
8    Canada 2012     33
9    France 2012     24
票数 3
EN

Stack Overflow用户

发布于 2018-03-26 02:25:07

对于data.table解决方案:

代码语言:javascript
运行
复制
library(data.table)
setDT(mydf)[,(People=sum(between(People, 15, 18))), by = .(year(Date), Country)]

   year   Country V1
1: 2010    Canada 22
2: 2010 Australia 17
3: 2010    France 22
4: 2011    Canada 23
5: 2011    France 22
6: 2011 Australia 26
7: 2012    Canada 21
8: 2012    France 29
9: 2012 Australia 26
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49478924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档