Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 每月月末统计员工人数,包括入职日期和退休日期_R_Dataframe - Fatal编程技术网

R 每月月末统计员工人数,包括入职日期和退休日期

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 ==========================

我有一个带有公司入职日期和退休日期的数据框。从这个数据框中,我想统计每个月底的工人数量

-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

你能帮我吗?

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)