R:在某些条件下提取载体中的最大值

时间:2014-02-05 23:46:50

标签: r row performance

我正在尝试查看一个大型数据集,该数据集表示一个人在公司的职业生涯历史。我希望看到一个人作为Manager工作的最长年数,条件是此人在成为Sales之前处于Boss类别(无论多少年在此之前)。数据如下所示:job2是一个虚拟变量,表示该人是Managercumu_job2表示某人处于Manager位置的累积年数(仅连续累积被认为是。)

  id    name    year    job    job2 cumu_job2
    1   Jane    1980    Worker  0   0
    1   Jane    1981    Manager 1   1
    1   Jane    1982    Sales   0   0
    1   Jane    1983    Sales   0   0
    1   Jane    1984    Manager 1   1
    1   Jane    1985    Manager 1   2
    1   Jane    1986    Boss    0   0
    2   Bob     1985    Worker  0   0
    2   Bob     1986    Sales   0   0
    2   Bob     1987    Manager 1   1
    2   Bob     1988    Manager 1   2
    2   Bob     1989    Boss    0   0

通过提取一个人工作的最长年限,在该人有Sales工作历史的情况下,我希望数据有另一列表示此信息:

id  name    year    job    job2    cumu_job2 cumu_max 
        1   Jane    1983    Sales       0       0
        1   Jane    1986    Boss        0       2
        2   Bob     1986    Sales       0       0 
        2   Bob     1989    Boss        0       2

所以我认为这需要两个步骤 - 我首先需要仅在人员从Sales移动到Boss时提取案例,然后将每个人的最大值存储在新的向量中{{1基于cumu_max

这是一个复杂的过程,因此非常感谢任何建议......!

我已经考虑过为什么以下使用cumu_job2的答案不起作用,这就是我的想法 - 这个例子表明所有人只有在成为经理后才成为老板,但我也有数据点看起来像dplyr

Kevin

所以最后,我想要

id  name    year    job    job2 cumu_job2
        1   Jane    1980    Worker  0   0
        1   Jane    1981    Manager 1   1
        1   Jane    1982    Sales   0   0
        1   Jane    1983    Sales   0   0
        1   Jane    1984    Manager 1   1
        1   Jane    1985    Manager 1   2
        1   Jane    1986    Boss    0   0
        2   Bob     1985    Worker  0   0
        2   Bob     1986    Sales   0   0
        2   Bob     1987    Manager 1   1
        2   Bob     1988    Manager 1   2
        2   Bob     1989    Boss    0   0
        3   Kevin   1991    Manager 1   1
        3   Kevin   1992    Manager 1   2
        3   Kevin   1993    Sales   0   0
        4   Kevin   1994    Boss    0   0

dplyr解决方案只吐出那些来自Sales - Manager - Boss的人,而没有考虑经理 - 销售 - 老板的可能性(在我的数据集中观察得更多)。

1 个答案:

答案 0 :(得分:1)

这可能不会涵盖您实际数据中的所有情况,但会(大部分)覆盖您正在寻找的内容。请注意,我添加了Jill,应根据您的条件将其排除在外。

require(dplyr)
dat <- read.table(header = TRUE, text = "id    name    year    job    job2 cumu_job2
1   Jane    1980    Worker  0   0
1   Jane    1981    Manager 1   1
1   Jane    1982    Sales   0   0
1   Jane    1983    Sales   0   0
1   Jane    1984    Manager 1   1
1   Jane    1985    Manager 1   2
1   Jane    1986    Boss    0   0
2   Bob     1985    Worker  0   0
2   Bob     1986    Sales   0   0
2   Bob     1987    Manager 1   1
2   Bob     1988    Manager 1   2
2   Bob     1989    Boss    0   0
3   Jill    1989    Worker  0   0
3   Jill    1990    Boss    0   0")

dat %.%
  group_by(id) %.%
  mutate(
    all_jobs = sum(unique(job) %in% c("Sales","Manager","Boss")),
    cumu_max = max(cumu_job2)
  ) %.%
  filter(all_jobs == 3, job %in% c("Sales","Boss"))

Source: local data frame [5 x 8]
Groups: id

  id name year   job job2 cumu_job2 all_jobs cumu_max
1  1 Jane 1982 Sales    0         0        3        2
2  1 Jane 1983 Sales    0         0        3        2
3  1 Jane 1986  Boss    0         0        3        2
4  2  Bob 1986 Sales    0         0        3        2
5  2  Bob 1989  Boss    0         0        3        2