r中的聚合和子集 - 计算参与者过去一起工作的小时数

时间:2016-03-15 20:28:42

标签: r

我正在使用在某些项目上合作的大型员工数据集。数据结构如下(抱歉标题!):

            Project Person_i Person_j Year Hours_ij
            101 ID1 ID4 2009    20
            101 ID2 ID5 2009    30
            101 ID3 ID6 2009    40
            102 ID1 ID4 2010    20
            102 ID2 ID5 2010    30
            102 ID3 ID6 2010    40
            103 ID1 ID4 2011    20
            103 ID2 ID5 2011    30
            103 ID3 ID6 2011    40
            104 ID1 ID4 2012    20
            104 ID2 ID5 2012    30
            104 ID3 ID6 2012    40

我想计算两个人(即“Person_i”和“Person_j”的独特组合)在之前的项目中合作的小时数。以下是所需数​​据的示例。这里,变量“Prior_hours”是变量“Year”的先前观察中“Hours_ij”的总和:

            Project Person_i    Person_j    Year    Hours_ij    Prior_hours
            101 ID1 ID4 2009    20  0
            101 ID2 ID5 2009    30  0
            101 ID3 ID6 2009    40  0
            102 ID1 ID4 2010    20  20
            102 ID2 ID5 2010    30  30
            102 ID3 ID6 2010    40  40
            103 ID1 ID4 2011    20  40
            103 ID2 ID5 2011    30  60
            103 ID3 ID6 2011    40  80
            104 ID1 ID4 2012    20  60
            104 ID2 ID5 2012    30  90
            104 ID3 ID6 2012    40  120

我曾尝试拆分和聚合文件(带子集),但我无法解决这个问题。非常感谢您的时间和帮助!

1 个答案:

答案 0 :(得分:2)

这适用于您的示例:

df <- read.table(text="Project Person_i Person_j Year Hours_ij
101 ID1 ID4 2009 20
101 ID2 ID5 2009 30
101 ID3 ID6 2009 40
102 ID1 ID4 2010 20
102 ID2 ID5 2010 30
102 ID3 ID6 2010 40
103 ID1 ID4 2011 20
103 ID2 ID5 2011 30
103 ID3 ID6 2011 40
104 ID1 ID4 2012 20
104 ID2 ID5 2012 30
104 ID3 ID6 2012 40", sep=" ", header=T)

df$Prior_hours <- unsplit(
     tapply(df$Hours_ij, 
            paste(df$Person_i, df$Person_j), 
            function(x) c(0,cumsum(x[1:length(x)-1]))),
     paste(df$Person_i, df$Person_j))

df
   Project Person_i Person_j Year Hours_ij Prior_hours
1      101      ID1      ID4 2009       20           0
2      101      ID2      ID5 2009       30           0
3      101      ID3      ID6 2009       40           0
4      102      ID1      ID4 2010       20          20
5      102      ID2      ID5 2010       30          30
6      102      ID3      ID6 2010       40          40
7      103      ID1      ID4 2011       20          40
8      103      ID2      ID5 2011       30          60
9      103      ID3      ID6 2011       40          80
10     104      ID1      ID4 2012       20          60
11     104      ID2      ID5 2012       30          90
12     104      ID3      ID6 2012       40         120