计算每个月末的工人数量,包括进入日期和退休日期

时间:2015-03-25 07:56:50

标签: 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
===============================
2008-05-31  1
2008-06-30  2
2008-07-31  2
......
2009-02-28  1
.......
2010-03-31  0

你能帮助我吗?

1 个答案:

答案 0 :(得分:2)

lubridate包具有轻松提取日期对象部分的功能;例如

library(lubridate)
month("2011/11/07")  # 11
year("2011/10/07")   # 2011

编辑:JoeArtisan指出,zoo包可用于创建年月变量(请参阅他的评论),这将是一个有趣的替代方案。代码可以很容易地适应这种可变的代码。 (结束编辑)

因此,您可以计算新列,一列包含年份,另一列包含月份。最终得到一个新的数据框(只保留那些带有补偿日期的新列)

entry.year entry.month retire.year retire.month
2008       12           2010        06
2007       05           2009        05
2009       04           2011        11
2010       03           2012        01

让我们使用更多虚假数据,看看它带给我们的地方......

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")

然后您可以使用以下内容获取频率:

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

如果相关的话,你还可以进一步计算时间(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)

依旧等等......很有趣,没有?