代码之家  ›  专栏  ›  技术社区  ›  Delopera

R: 使用为循环创建新列

  •  1
  • Delopera  · 技术社区  · 2 年前

    我有这样的大数据帧

     df <- data.frame(min =seq(1,90, by=1), event=sample(LETTERS,90,replace=TRUE))
    

    我想创建新的列(段)来识别和命名特定值之间的段。

    例如,第一个段应该从数据帧的开头开始,直到事件“A”。第二段应在“A”之后开始,并一直持续到下一个事件“A”。最后一段应该从最后一个“A”开始,直到数据帧结束。

    最好显示所需的输出

    最小 事件
    1. C 1-5
    2. D 1-5
    3. D 1-5
    4. E 1-5
    5. A. 1-5
    6. E 6-10
    7. G 6-10
    8. G 6-10
    9 G 6-10
    10 A. 6-10
    11 F 11-12
    12 G 11-12

    我知道我应该使用循环,但有点困惑如何做到这一点。

    2 回复  |  直到 2 年前
        1
  •  3
  •   Allan Cameron    2 年前

    不需要显式循环。中的一些简单数据操作 dplyr 应该做到这一点:

    library(dplyr)
    
    df <- data.frame(min = 1:12, 
                     event = c("C", "D", "D", "E", "A", 
                               "E", "G", "G", "G", "A", "F", "G"))
    
    df %>%
      mutate(cluster = lag(cumsum(event == "A"), 1, 0)) %>%
      mutate(segment = paste(first(min), last(min), sep = "-"), .by = "cluster") %>%
      select(-cluster)
    #>    min event segment
    #> 1    1     C     1-5
    #> 2    2     D     1-5
    #> 3    3     D     1-5
    #> 4    4     E     1-5
    #> 5    5     A     1-5
    #> 6    6     E    6-10
    #> 7    7     G    6-10
    #> 8    8     G    6-10
    #> 9    9     G    6-10
    #> 10  10     A    6-10
    #> 11  11     F   11-12
    #> 12  12     G   11-12
    
        2
  •  3
  •   Rui Barradas    2 年前

    这是一个基本的R解决方案。
    在每个段的开头创建一个逻辑索引。 tapply 按该索引分组(使用标准 cumsum trick)将获得片段的长度。然后,确定每个线段的起点和终点,将它们粘贴在一起,并复制这些值以获得所需的矢量。

    set.seed(2023)
    df <- data.frame(min =seq(1,90, by=1), event=sample(LETTERS,90,replace=TRUE))
    
    i_A <- df$event == "A"
    n <- with(df, tapply(event, cumsum(i_A), length))
    if(!i_A[nrow(df)]) i_A[nrow(df)] <- TRUE
    end <- which(i_A)
    start <- c(0L, end[-length(end)]) + 1L
    df$segment <- rep(paste(start, end, sep = "-"), n)
    head(df)
    #>   min event segment
    #> 1   1     U    1-11
    #> 2   2     P    1-11
    #> 3   3     O    1-11
    #> 4   4     I    1-11
    #> 5   5     H    1-11
    #> 6   6     S    1-11
    

    创建于2023-12-16 reprex v2.0.2

    推荐文章