我正在尝试查看一个大型数据集,该数据集表示一个人在公司的职业生涯历史。我希望看到一个人作为Manager
工作的最长年数,条件是此人在成为Sales
之前处于Boss
类别(无论多少年在此之前)。数据如下所示:job2
是一个虚拟变量,表示该人是Manager
,cumu_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的人,而没有考虑经理 - 销售 - 老板的可能性(在我的数据集中观察得更多)。
答案 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