2017-05-30 54 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