【问题标题】:How to build a sequence using a rolling variable in R [duplicate]如何使用R中的滚动变量构建序列[重复]
【发布时间】:2019-12-11 01:50:05
【问题描述】:

我正在尝试构建一个序列,该序列采用前一个值并将其添加到序列中。

例如:

Var1 Var2 
1     A
1     B
1     C
2     A
2     C
2     D

我正在寻找的输出是:

Var1 Var2 Var3
1    A   A
1    B   A>B
1    C   A>B>C
2    A   A
2    C   A>C
2    D   A>C>D

有这个包吗?序列中的元素数量可能会变得非常大,因此我当前在 dplyr 中使用 lag 的方法如果不写出同一段代码 n 次(其中 n 是序列中的最大元素数量)是不可行的。

【问题讨论】:

    标签: r sequence


    【解决方案1】:

    我建议您将runner 打包用于顺序功能。函数runner::runner 应用任何传递给f 的R 函数(需要指定输出type

    # data
    df <- data.frame(
      var1 = rep(c(1,2), each = 3), 
      var2 = rep(c("A", "B", "C"), 2))
    
    # result
    library(dplyr)
    library(runner)
    df %>%
     group_by(var1) %>%
     mutate(var3 = runner(var2, 
                          function(x) paste(x, collapse = ">"),
                          type = "character")) 
    
    
     #    var1 var2  var3 
     #   <dbl> <fct> <chr>
     # 1     1 A     A    
     # 2     1 B     A>B  
     # 3     1 C     A>B>C
     # 4     2 A     A    
     # 5     2 B     A>B  
     # 6     2 C     A>B>C
    

    查看documentation 了解更多选项

    【讨论】:

      【解决方案2】:

      您可以使用 by() 并利用有用的 R factors。我们通过变换/重新变换到因子并返回得到"numeric"s。用Map生成增长的sequences,再次转换为因子并根据Var2分配标签,用"&gt;"折叠。 concatenate 和 unlist 一切,你会得到"Var3"。 (不过,在大数据帧中可能会很慢。)

      dat$Var3 <- unlist(do.call(c, by(dat, dat$Var1, function(s) {
        r <- Map(seq, as.numeric(factor(s$Var2)))
        r <- lapply(r, levels=1:3, labels=s$Var2, factor)
        return(Map(paste, r, collapse=">"))
      })))
      dat
      #   Var1 Var2  Var3
      # 1    1    A     A
      # 2    1    B   A>B
      # 3    1    C A>B>C
      # 4    2    A     A
      # 5    2    C   A>C
      # 6    2    D A>C>D
      

      数据

      dat <- structure(list(Var1 = c(1L, 1L, 1L, 2L, 2L, 2L), Var2 = c("A", 
      "B", "C", "A", "C", "D")), row.names = c(NA, -6L), class = "data.frame")
      

      【讨论】:

        【解决方案3】:

        你可以这样做:

        transform(dat, Var3 = ave(Var2, Var1, FUN = function(x) sapply(seq_along(x), function(i) paste(x[1:i], collapse = ">"))))
        
          Var1 Var2  Var3
        1    1    A     A
        2    1    B   A>B
        3    1    C A>B>C
        4    2    A     A
        5    2    C   A>C
        6    2    D A>C>D
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-23
          • 1970-01-01
          • 2019-12-23
          • 2021-02-15
          • 2021-09-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多