how to cumulatively add values in one vector in R
cumulative-sum, dplyr, r, row
Solution
Here is the succinct `dplyr` solution for the same problem.
NOTE: Make sure that `stringsAsFactors = FALSE` while reading in the data.
library(dplyr)
dat %>%
group_by(name, job) %>%
filter(job != "Boss" | year == min(year)) %>%
mutate(cumu_job2 = cumsum(job2))
Output:
id name year job job2 cumu_job2
1 1 Jane 1980 Worker 0 0
2 1 Jane 1981 Manager 1 1
3 1 Jane 1982 Manager 1 2
4 1 Jane 1983 Manager 1 3
5 1 Jane 1984 Manager 1 4
6 1 Jane 1985 Manager 1 5
7 1 Jane 1986 Boss 0 0
8 2 Bob 1985 Worker 0 0
9 2 Bob 1986 Worker 0 0
10 2 Bob 1987 Manager 1 1
11 2 Bob 1988 Boss 0 0
Explanation
- Take the dataset
- Group by name and job
- Filter each group based on condition
- Add `cumu_job2` column.
Problem
I have a data set that looks like this ``` id name year job job2 1 Jane 1980 Worker 0 1 Jane 1981 Manager 1 1 Jane 1982 Manager 1 1 Jane 1983 Manager 1 1 Jane 1984 Manager 1 1 Jane 1985 Manager 1 1 Jane 1986 Boss 0 1 Jane 1987 Boss 0 2 Bob 1985 Worker 0 2 Bob 1986 Worker 0 2 Bob 1987 Manager 1 2 Bob 1988 Boss 0 2 Bob 1989 Boss 0 2 Bob 1990 Boss 0 2 Bob 1991 Boss 0 2 Bob 1992 Boss 0 ``` Here, `job2` denotes a dummy variable indicating whether a person was a `Manager` during that year or not. I want to do two things to this data set: first, I only want to preserve the row when the person became `Boss` for the first time. Second, I would like to see cumulative years a person worked as a `Manager` and store this information in the variable `cumu_job2`. Thus I would like to have: ``` id name year job job2 cumu_job2 1 Jane 1980 Worker 0 0 1 Jane 1981 Manager 1 1 1 Jane 1982 Manager 1 2 1 Jane 1983 Manager 1 3 1 Jane 1984 Manager 1 4 1 Jane 1985 Manager 1 5 1 Jane 1986 Boss 0 0 2 Bob 1985 Worker 0 0 2 Bob 1986 Worker 0 0 2 Bob 1987 Manager 1 1 2 Bob 1988 Boss 0 0 ``` I have changed my examples and included the Worker position because this reflects more what I want to do with the original data set. The answers in this thread only works when there are only Managers and Boss in the data set - so any suggestions for making this work would be great. I'll be very much grateful!!