【问题标题】:R How to Generate Sequences in a Tibble Given Start and End PointsR如何在给定起点和终点的小标题中生成序列
【发布时间】:2021-08-28 15:55:29
【问题描述】:

我想不出如何以整洁的方式做到这一点。

我有一张如下表:

tibble( 
  Min = c(1, 5, 12, 13, 19), 
  Max = c(3, 11, 12, 14, 19), 
  Value = c("a", "bb", "c", "d", "e" ) 
)

我想从中生成另一个表,如下所示

tibble(
  Row = c(1:3, 5:11, 12:12, 13:14, 19:19), 
  Value = c( rep("a", 3), rep("bb", 7), "c", "d", "d", "e" ) 
)

感谢大家提出的任何建议。唯一想到的“解决方案”有点麻烦。

【问题讨论】:

    标签: r tidyverse sequence generate run-length-encoding


    【解决方案1】:

    1) 如果 DF 是输入,那么:

    library(dplyr)
    
    DF %>%
     group_by(Value) %>%
     group_modify(~ tibble(Row = seq(.$Min, .$Max))) %>%
     ungroup
    

    给予:

    # A tibble: 14 x 2
       Value   Row
       <chr> <int>
     1 a         1
     2 a         2
     3 a         3
     4 bb        5
     5 bb        6
     6 bb        7
     7 bb        8
     8 bb        9
     9 bb       10
    10 bb       11
    11 c        12
    12 d        13
    13 d        14
    14 e        19
    

    2) 这会创建一个包含小标题的列表列 L,然后将其取消嵌套。重复的Value 元素可以用这个。

    library(dplyr)
    library(tidyr)
    
    DF %>%
     rowwise %>%
     summarize(L = list(tibble(Value, Row = seq(Min, Max)))) %>%
     ungroup %>%
     unnest(L)
    

    【讨论】:

    • 非常漂亮!您介意澄清group_modify(~ tibble(Row = seq(.$Min, .$Max))) 行中发生的确切情况吗?现在tibble(Row = seq(.$Min, .$Max)) 很明显,但是当公式~ tibble(Row = seq(.$Min, .$Max)) 转换为函数并按组应用时会发生什么?什么被改变或覆盖,以及如何?我无法将它与documentation 完全联系在一起...
    • 对于每个值,该函数运行产生一个小标题,添加一个值列,它们都绑定在一起。 dplyr 曾经有 do 用于此目的,但 group_modify 取代了它。
    • 是的,它们都会被添加。
    • 这样的? x %>% mutate(ID = 1:nrow(x)) %>% group_by(ID, Value) %>% group_modify(~ tibble(Row = seq(.$Min, .$Max))) %>% ungroup ()
    • 添加了第二种方法。它可以处理重复的值而无需更改。
    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2021-03-15
    • 2018-09-27
    相关资源
    最近更新 更多