【问题标题】:Extract rolling maximum value based on column value根据列值提取滚动最大值
【发布时间】:2017-05-30 12:51:03
【问题描述】:

我有一些数据,我已经对其进行了聚类分析,需要根据人口密度找到断点。集群严重重叠,因此我按人口密度对数据进行了排序,并希望在“集群”列切换到另一个集群之前提取最后一个值。基本上数据是这样的:

cluster  PopDens
1        5
1        7
2        8
2        9
1        10
1        12
3        14
1        16

我希望它返回以下内容:

Cluster  PopDens
1        7
2        9
1        12
3        14
1        16

我将如何在 R 中实现这一目标?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    在基础 R 中,可以使用:

    x[cumsum(rle(x$cluster)$lengths),]
    #  cluster PopDens
    #2       1       7
    #4       2       9
    #6       1      12
    #7       3      14
    #8       1      16
    

    如果您有兴趣,这也可以直接转换为data.table

    library(data.table)
    setDT(x)[cumsum(rle(cluster)$lengths)]
    

    当然我们也可以在dplyr

    library(dplyr)
    slice(x, cumsum(rle(cluster)$len))
    

    【讨论】:

    • 巧妙利用rle!
    • 谢谢!完美运行。
    【解决方案2】:

    data.tablerleid()函数可以用于分组:

    library(data.table)
    setDT(DF)[, .(PopDens = last(PopDens)), .(rleid(cluster), cluster)][, rleid := NULL][]
    #   cluster PopDens
    #1:       1       7
    #2:       2       9
    #3:       1      12
    #4:       3      14
    #5:       1      16
    

    有其他方法可以达到相同的结果:

    DF[, .(PopDens = PopDens[.N]), .(rleid(cluster), cluster)][, rleid := NULL][]
    DF[, .(PopDens = tail(PopDens, 1), .(rleid(cluster), cluster)][, rleid := NULL][]
    DF[, .SD[.N], .(rleid(cluster), cluster)][, rleid := NULL][]
    DF[, tail(.SD, 1), .(rleid(cluster), cluster)][, rleid := NULL][]
    

    【讨论】:

      【解决方案3】:

      另一个data.table解决方案:

      library(data.table)
      setDT(df)[df[, tail(.I,1), rleid(cluster)]$V1]
      

      给出:

         cluster PopDens
      1:       1       7
      2:       2       9
      3:       1      12
      4:       3      14
      5:       1      16
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-27
        • 1970-01-01
        相关资源
        最近更新 更多