R 连续值的累积和

R 连续值的累积和,r,R,我有一个简单的数据集,其中包含美国国家经济研究院(NBER)的经济衰退,目前被编码为虚拟变量。我想按顺序给每一次衰退贴上标签。例如,在下表中,我希望衰退列的读数为衰退1、无衰退、衰退2等等,从而对每个衰退进行分类 Date Recession 1949-06-30 1 1949-09-30 1 1949-12-31 1 1950-03-31 0 1950-06-30 0 1953-09-30 1 1953-12-31 1 您可以使用rle计算1的连续运行次数,并重复相应的次数 这里有一

我有一个简单的数据集,其中包含美国国家经济研究院(NBER)的经济衰退,目前被编码为虚拟变量。我想按顺序给每一次衰退贴上标签。例如,在下表中,我希望衰退列的读数为衰退1、无衰退、衰退2等等,从而对每个衰退进行分类

Date    Recession 
1949-06-30 1
1949-09-30 1
1949-12-31 1
1950-03-31 0
1950-06-30 0
1953-09-30 1
1953-12-31 1
您可以使用rle计算1的连续运行次数,并重复相应的次数


这里有一个整洁的方法:

使用lag计算衰退状态是否发生变化 使用&和cumsum计算它是否从无衰退变为衰退 用if_else替换所有应为衰退且无衰退的行 图书馆管理员 df% 变异 改变=衰退!=滞后衰退,默认=衰退[1], to_recession=str_cRecession,cumsumchanged&as.logical recession+1, 衰退数量=如果其他衰退==1,则为衰退,无衰退 %>% 选择已更改,-to\u >一个tibble:7x3 >日期衰退次数 > >1 1949-06-30经济衰退1 >1949年9月30日经济衰退 >1949年12月31日经济衰退 >4 1950-03-31 0没有衰退 >5 1950-06-30 0无衰退 >6 1953-09-30经济衰退2 >7 1953年12月31日经济衰退2 由v0.2.1于2018年10月30日创建,这里是一个cumsum技巧


为什么1949-09-30没有衰退。抱歉,更清楚地说,它应该是:衰退1,衰退1,衰退1,不衰退,不衰退,衰退2,衰退2函数ifelse将帮助您处理这个衰退2是因为它是第二个非零补丁?是的,没错,在我的实际数据集中,它们是更多的零补丁和非零补丁,标记为:无衰退下一批零,衰退3下一批1,无衰退下一批零,衰退4下一批1,依此类推。如果衰退=1,则返回行号,但是如果一行中有多个1,则不返回相同的数字。如何在一行中有多个1?这不是需要的输出,因为它将衰退2分配给第二行
unlist(lapply(1:nrow(df), FUN = function(x) ifelse(df$recession[x]==1, paste("Recession", x), "No Recession")))
Date <- as.Date(c('1949-06-30', '1949-09-30', '1949-12-31', '1950-03-31', '1950-06-30', '1953-09-30', '1953-12-31'), 
                format = '%Y-%m-%d')
Recession <- c(1,1,1,0,0,1,1)

df <- data.frame(Date, Recession)

find_seq_1s <- function(x) {
        count <-  0
        in_seq <-  FALSE
        output <-  NULL
        for(i in x) {
                if(i == 1 && in_seq == FALSE) {
                        count <- count + 1
                        in_seq <-  TRUE
                        output <-  c(output, paste('Recession', as.character(count)))
                } else if(i == 1 && in_seq == TRUE) {
                        output <-  c(output, paste('Recession', as.character(count)))
                } else {
                        in_seq <-  FALSE
                        output <-  c(output, 'No Recession')
                }
        }
        return(output)
}

df$Rec_Seq <- find_seq_1s(df$Recession)
foo <- with(rle(input$Recession), rep(cumsum(values) * values, lengths))
ifelse(foo == 0, "No Recession", paste("Recession", foo))
structure(list(Date = c("1949-06-30", "1949-09-30", "1949-12-31", 
"1950-03-31", "1950-06-30", "1953-09-30", "1953-12-31"), Recession = c(1L, 
1L, 1L, 0L, 0L, 1L, 1L)), row.names = c(NA, -7L), class = "data.frame")
x <- c(1, 1, 1, 0, 0, 1, 1)
i <- cumsum(c(1, diff(x) != 0) & as.logical(x))
ifelse(x == 0, "No Recession", paste("Recession", i))
#[1] "Recession 1"  "Recession 1"  "Recession 1"  "No Recession"
#[5] "No Recession" "Recession 2"  "Recession 2"