根据列值提取滚动最大值

时间:2017-05-30 12:51:04

标签: r dataframe

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

INSERT INTO religion
(
    id,
    name
)
SELECT
    tbl.Id,
    tbl.`name`
FROM
    (
        SELECT 4 as Id, '3' as name
    ) as tbl
WHERE NOT EXISTS(SELECT NULL FROM religion WHERE religion.id=tbl.Id);

我希望它返回以下内容:

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

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

3 个答案:

答案 0 :(得分:3)

在基础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))

答案 1 :(得分:0)

使用data.table rleid()功能可以用于分组:

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][]

答案 2 :(得分:0)

另一个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