基于列值提取滚动最大值
问题描述:
我有一些数据,我已经执行聚类分析并需要根据总体密度找到断点。簇重叠很大,所以我按照种群密度对数据进行了排序,并希望在“簇”列切换到另一个簇之前提取最后一个值。基本数据如下:基于列值提取滚动最大值
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它可以使用来完成:
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))
答
随着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][]
答
另一个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
巧妙使用'rle'! – Jaap
谢谢!完美的作品。 –