【问题标题】:Append values of a column if values in another column are sequential in R如果另一列中的值在 R 中是连续的,则附加列的值
【发布时间】:2017-10-04 18:53:28
【问题描述】:

如果另一列的值增加 1,我正在寻找一种连接列值的便捷方法。 我的数据框

      st        row_index
 1    alpha        2
 2    beta         7
 3    gamma       11
 4    delta       12
 5    zero        15
 6    one         16
 7    two         17

目标数据框

    st             row_index
1   alpha              2
2   beta               7
3   gammadelta        11
4   zero one two      15

【问题讨论】:

    标签: r dplyr aggregate


    【解决方案1】:

    可以使用lagcumsum创建一个辅助组变量g,然后通过这个变量进行汇总; row_index - lag(row_index, default=0) != 1 检查当前 row_index 和前一个之间的差异,如果它不同于 1,则返回 TRUE(使用 default=0 删除由 lag 引入的 NA ),结合cumsum,它为每个连续的行块提供一个唯一的ID,其中row_index的差异为1:

    df %>% 
        group_by(g = cumsum(row_index - lag(row_index, default=0) != 1)) %>% 
        summarise(st = paste(st, collapse = " "), row_index = first(row_index)) %>% 
        select(-g)
    
    # A tibble: 4 x 2
    #            st row_index
    #         <chr>     <int>
    #1        alpha         2
    #2         beta         7
    #3  gamma delta        11
    #4 zero one two        15
    

    【讨论】:

      【解决方案2】:

      这是data.table 的选项。按'row_index'不为1的差值的累积和分组,paste'st'的元素一起取'row_index'的第一个值

      library(data.table)
      setDT(df1)[, .(st = paste(st, collapse= ' '),
           row_index = row_index[1]), .(grp = cumsum(c(TRUE, diff(row_index) != 1)))
             ][, .(st, row_index)]
      #             st row_index
      #1:        alpha         2
      #2:         beta         7
      #3:  gamma delta        11
      #4: zero one two        15
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-15
        • 1970-01-01
        • 2019-05-26
        • 2016-07-05
        • 1970-01-01
        相关资源
        最近更新 更多