R 基于列值提取滚动最大值

R 基于列值提取滚动最大值,r,dataframe,R,Dataframe,我对一些数据进行了聚类分析,需要根据人口密度找到断点。集群重叠严重,因此我已按人口密度对数据进行了排序,并希望在“集群”列切换到另一个集群之前提取最后一个值。基本上,数据如下所示: cluster PopDens 1 5 1 7 2 8 2 9 1 10 1 12 3 14 1 16 我希望它返回以下内容: Cluster PopDens 1 7 2

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

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中实现这一点?

使用
数据。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][]

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

在base R中,可以使用以下方法完成:

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

如果您感兴趣,这也可以直接转换为
数据。表

library(data.table)
setDT(x)[cumsum(rle(cluster)$lengths)]
当然,我们也可以在dplyr中执行此操作:

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

在base R中,可以使用以下方法完成:

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

如果您感兴趣,这也可以直接转换为
数据。表

library(data.table)
setDT(x)[cumsum(rle(cluster)$lengths)]
当然,我们也可以在dplyr中执行此操作:

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

另一个
数据表
解决方案:

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


另一个
数据表
解决方案:

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


巧妙使用
rle
!非常感谢。工作完美。巧妙使用
rle
!非常感谢。工作完美。