我有每天的数据,我想统计一下每天的测量在一定范围内的次数。数据也是按因子分组的,因此我需要知道在某个范围内(例如15到18)的每个因子每年的天数
我有一个超过100年的大型数据集,但这里有一些仅用于此示例的数据:
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之间的次数。
因此,我的输出将是一个新的数据帧,类似于:
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任何帮助都会非常感谢,因为我正在努力解决这个问题,并寻找了答案,但我找不到一个涉及日期和因素的解决方案。
发布于 2018-03-26 02:16:20
您可以使用lubridate和dplyr实现这一点。使用year()根据年份和国家/地区获取年份和组。最后一步是条件总结:
library(dplyr)
library(lubridate)
mydf %>%
group_by(year = year(Date), Country) %>%
summarise(p = sum(between(People, 15, 18)))
这可能会导致
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发布于 2018-03-26 02:46:14
下面是必需的基本解决方案。要点:使用format.Date将日期转换为字符年份值,按分组需要是list-object:
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如果您希望结果数据帧具有不同的列名,则将这些列名添加到按组定义中的列表中:
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发布于 2018-03-26 02:25:07
对于data.table解决方案:
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 26https://stackoverflow.com/questions/49478924
复制相似问题