【问题标题】:Combing data frame rows in R based on common values根据常用值组合 R 中的数据框行
【发布时间】:2019-12-05 00:40:47
【问题描述】:

给定一个数据框:

    > df <- data.frame( L=c('a','b','b'), t0=c(1,10,20), t1=c(9,19,39))
    > df
      L t0 t1
    1 a  1  9
    2 b 10 19
    3 b 20 39

    I want:
    > df
        L t0 t1
      1 a  1  9
      2 b 10 39

df$L 的相同值等于 "b" 表示 'b' 的第一个实例的开始 (t0) 应该是新的 't0' 值和 ( contiguous) 'b' 应该是新的 't1' 值。实际上,如果 t0 和 t1 是时间,那么我想合并具有相同 'L' 值的相邻行的持续时间。

【问题讨论】:

    标签: r


    【解决方案1】:

    按“L”分组后,summarise 取“t0”的first 值和“t1”的last 值(或minmax

    df %>%
       group_by(L) %>%
        summarise(t0 = first(t0), t1 = last(t1))
    # A tibble: 2 x 3
    #  L        t0    t1
    #  <fct> <dbl> <dbl>
    #1 a         1     9
    #2 b        10    39
    

    基于 OP 的 cmets,如果我们还按 'L' 中相邻的相似元素进行分组,请使用 rleid

    library(data.table)
    df1 %>% 
        group_by(grp = rleid(L), L) %>%
        summarise(t0 = first(t0), t1 = last(t1))
    

    数据

    df1 <- data.frame( L=c('a','b','b','a','b','b'), 
            t0=c(1,10,20,40,60,70), t1=c(9,19,39,49,69,79))
    

    【讨论】:

    • 太棒了!如果给定标签有多个“运行”,有没有办法扩展这个想法?例如: df
    • @MarkBower 你的评论我没有完成。示例丢失
    • @MarkBower 抱歉,之前没有看到您的完整评论示例。 library(data.table);df %&gt;% group_by(grp = rleid(L), L) %&gt;% summarise(t0 = first(t0), t1 = last(t1))
    • 完美!感谢您的帮助和快速回复!
    【解决方案2】:

    您可以通过Lsplit 并返回range

    df <- do.call(rbind, lapply(split(df[-1], df[1]), range))
    df
    #  [,1] [,2]
    #a    1    9
    #b   10   39
    
    df <- data.frame(L=rownames(df), t0=df[,1], t1=df[,2])
    df
    #  L t0 t1
    #a a  1  9
    #b b 10 39
    

    【讨论】:

    • 谢谢!是否可以对其进行修改以处理类似 L 值的“运行”?
    • @MarkBower 当您可以将相似的 L 值分组到唯一的类时,请使用这些值而不是 L。
    【解决方案3】:

    也许你可以试试aggreatemerge

    res <- merge(aggregate(t0 ~ L,df,min),aggregate(t1 ~ L,df,max))
    

    这样

    > res
      L t0 t1
    1 a  1  9
    2 b 10 39
    

    【讨论】:

      【解决方案4】:

      使用data.table

      library(data.table)
      setDT(df)
      df[, .(t0 = t0[1], t1 = t1[.N]), by = L]
      
      #    L t0 t1
      # 1: a  1  9
      # 2: b 10 39
      

      【讨论】:

        猜你喜欢
        • 2016-12-09
        • 1970-01-01
        • 2018-12-18
        • 1970-01-01
        • 1970-01-01
        • 2019-12-04
        • 2015-09-16
        • 1970-01-01
        • 2022-06-21
        相关资源
        最近更新 更多