2017-05-30 49 views
0

我有一些数据,我已经执行聚类分析并需要根据总体密度找到断点。簇重叠很大,所以我按照种群密度对数据进行了排序,并希望在“簇”列切换到另一个簇之前提取最后一个值。基本数据如下:基于列值提取滚动最大值

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

回答

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)) 
+0

巧妙使用'rle'! – Jaap

+0

谢谢!完美的作品。 –

0

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