how to cumulatively add values in one vector in R

前端 未结 5 1610
耶瑟儿~
耶瑟儿~ 2020-12-01 18:54

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    Manage         


        
5条回答
  •  旧巷少年郎
    2020-12-01 19:57

    @BrodieG's is way better:

    The Data

    dat <- read.table(text="id  name    year    job    job2
    1   Jane    1980    Manager 1
    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    Manager 1
    2   Bob     1986    Manager 1
    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", header=TRUE)
    

    #The code:

    inds1 <- rle(dat$job2)
    inds2 <- cumsum(inds1[[1]])[inds1[[2]] == 1] + 1
    
    ends <- cumsum(inds1[[1]])
    starts <- c(1, head(ends + 1, -1))
    inds3 <- mapply(":", starts, ends)
    dat$id <- rep(1:length(inds3), sapply(inds3, length))
    dat <- do.call(rbind, lapply(split(dat[, 1:5], dat$id ), function(x) {
        if(x$job2[1] == 0){ 
            x$cumu_job2 <- rep(0, nrow(x))
        } else { 
            x$cumu_job2 <- 1:nrow(x)
        }
        x
    }))
    
    
    keeps <- dat$job2 > 0
    keeps[inds2] <- TRUE
    dat2 <- data.frame(dat[keeps, ], row.names = NULL)
    dat2
    
    ##    id name year     job job2 cumu_job2
    ## 1   1 Jane 1980 Manager    1         1
    ## 2   1 Jane 1981 Manager    1         2
    ## 3   1 Jane 1982 Manager    1         3
    ## 4   1 Jane 1983 Manager    1         4
    ## 5   1 Jane 1984 Manager    1         5
    ## 6   1 Jane 1985 Manager    1         6
    ## 7   2 Jane 1986    Boss    0         0
    ## 8   3  Bob 1985 Manager    1         1
    ## 9   3  Bob 1986 Manager    1         2
    ## 10  3  Bob 1987 Manager    1         3
    ## 11  4  Bob 1988    Boss    0         0
    

提交回复
热议问题