R 每月月末统计员工人数,包括入职日期和退休日期
我有一个带有公司入职日期和退休日期的数据框。从这个数据框中,我想统计每个月底的工人数量 -Dataframe有公司进入日期和退休日期R 每月月末统计员工人数,包括入职日期和退休日期,r,dataframe,R,Dataframe,我有一个带有公司入职日期和退休日期的数据框。从这个数据框中,我想统计每个月底的工人数量 -Dataframe有公司进入日期和退休日期 ID entry-date retire-date =========================== 1 2008-05-06 2010-03-03 2 2008-06-04 2009-02-25 I wanna count like this Time NumberOfWorkers ==========================
ID entry-date retire-date
===========================
1 2008-05-06 2010-03-03
2 2008-06-04 2009-02-25
I wanna count like this
Time NumberOfWorkers
===============================
2008-05-31 1
2008-06-30 2
2008-07-31 2
......
2009-02-28 1
.......
2010-03-31 0
你能帮我吗?
lubridate
软件包具有轻松提取部分日期对象的功能;比如说
library(lubridate)
month("2011/11/07") # 11
year("2011/10/07") # 2011
Edit:JoeArtisan指出,zoo
包可以用来创建一个年-月变量(参见他的评论),这将是一个有趣的替代方案。该代码可以很容易地进行调整,以使用这样的变量。(结束编辑)
因此,您可以计算新列,一列包含年份,另一列包含月份。您将得到一个新的数据框(仅保留那些具有补足日期的新列)
让我们使用更多的假数据,看看它会把我们引向何方
dat <- read.csv(text=
"entry.year,entry.month,retire.year,retire.month
2008,12,2010,06
2007,05,2009,05
2009,04,2011,11
2010,03,2012,01
2008,12,2011,01
2007,05,2010,06
2009,03,2011,01
2010,03,2012,01
2008,11,2009,07
2007,05,2011,11
2008,04,2010,02
2010,03,2011,06
2008,09,2012,01
2007,05,2010,06
2009,03,2011,01
2010,03,2012,01")
然后,如果相关的话,你还可以更进一步,很容易地计算出一段时间(4个月、6个月或整整一年)的总统计数据。比如说,
by(data = final$Freq.entries, INDICES = final$Year, FUN = sum, na.rm=TRUE)
by(data = final$Freq.retires, INDICES = final$Year, FUN = sum, na.rm=TRUE)
诸如此类。。。非常有趣,不是吗?回答得很好@DominicComtois,但我想你可以使用
zoo
软件包中的yearmon
功能,将日期转换为年-月格式,而不是有单独的月和年列,例如library(zoo);2011年11月1日(“2011/11/07”)#“2011年11月”
好主意!介意我把它和我的答案结合起来吗?没问题。还有一个名为seq.Date(from,to,by='month')
的函数,您可以使用它来查找最终数据框中缺少的月份。好的。。。请随意编辑,我今天休息。否则,我将在明天编辑它。谢谢你的建议!:)看来这个职位现在被搁置了。。。在进行更多编辑之前,将查看OP是否希望改进他们的问题,或者是否接受答案。
entries <- as.data.frame(table(dat[,1:2]))
retires <- as.data.frame(table(dat[,3:4]))
colnames(entries) = c("Year", "Month", "Freq.entries")
colnames(retires) = c("Year", "Month", "Freq.retires")
final <- merge(entries, retires, by = c("Year", "Month"), all=TRUE)
# Replace NA values with 0
final[is.na(final)] <- 0
# Calculate the monthly fluctuation in employees
final$difference <- final$Freq.entries - final$Freq.retires
# And a cumulative sum
final$cumul <- cumsum(final$difference)
> final
Year Month Freq.entries Freq.retires difference cumul
1 2007 3 0 0 0 0
2 2007 4 0 0 0 0
3 2007 5 4 0 4 4
4 2007 9 0 0 0 4
5 2007 11 0 0 0 4
6 2007 12 0 0 0 4
7 2008 3 0 0 0 4
8 2008 4 1 0 1 5
9 2008 5 0 0 0 5
10 2008 9 1 0 1 6
11 2008 11 1 0 1 7
12 2008 12 2 0 2 9
13 2009 3 2 0 2 11
14 2009 4 1 0 1 12
15 2009 5 0 1 -1 11
16 2009 9 0 0 0 11
17 2009 11 0 0 0 11
18 2009 12 0 0 0 11
19 2009 1 0 0 0 11
20 2009 2 0 0 0 11
21 2009 6 0 0 0 11
22 2009 7 0 1 -1 10
23 2010 3 4 0 4 14
24 2010 4 0 0 0 14
25 2010 5 0 0 0 14
26 2010 9 0 0 0 14
27 2010 11 0 0 0 14
28 2010 12 0 0 0 14
29 2010 1 0 0 0 14
30 2010 2 0 1 -1 13
31 2010 6 0 3 -3 10
32 2010 7 0 0 0 10
33 2011 5 0 0 0 10
34 2011 11 0 2 -2 8
35 2011 1 0 3 -3 5
36 2011 2 0 0 0 5
37 2011 6 0 1 -1 4
38 2011 7 0 0 0 4
39 2012 5 0 0 0 4
40 2012 11 0 0 0 4
41 2012 1 0 4 -4 0
42 2012 2 0 0 0 0
43 2012 6 0 0 0 0
44 2012 7 0 0 0 0
by(data = final$Freq.entries, INDICES = final$Year, FUN = sum, na.rm=TRUE)
by(data = final$Freq.retires, INDICES = final$Year, FUN = sum, na.rm=TRUE)