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