Mám nejaké údaje, ktoré som vykonal v klastrianalýzu a potrebu nájsť hranice na základe hustoty obyvateľstva. Klastre sa výrazne prekrývajú, a preto som zoradil údaje podľa hustoty obyvateľstva a chcel by som extrahovať poslednú hodnotu skôr, ako sa stĺpec "klastra" prepne na iný klastr. V podstate údaje vyzerajú takto:
cluster PopDens
1 5
1 7
2 8
2 9
1 10
1 12
3 14
1 16
A chcel by som, aby vrátila nasledovné:
Cluster PopDens
1 7
2 9
1 12
3 14
1 16
Ako by som mohol dosiahnuť to v R?
odpovede:
3 pre odpoveď č. 1V základni R by to bolo možné vykonať pomocou:
x[cumsum(rle(x$cluster)$lengths),]
# cluster PopDens
#2 1 7
#4 2 9
#6 1 12
#7 3 14
#8 1 16
To sa tiež prekladá docela priamo data.table
v prípade záujmu:
library(data.table)
setDT(x)[cumsum(rle(cluster)$lengths)]
A samozrejme to môžeme urobiť aj dplyr
:
library(dplyr)
slice(x, cumsum(rle(cluster)$len))
0 pre odpoveď č. 2
s data.table
na rleid()
funkciu môžete použité pre zoskupenia:
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
Existujú alternatívne spôsoby, ako dosiahnuť rovnaký výsledok:
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 pre odpoveď č. 3
Ďalší data.table
Riešenie:
library(data.table)
setDT(df)[df[, tail(.I,1), rleid(cluster)]$V1]
ktorý poskytuje:
cluster PopDens 1: 1 7 2: 2 9 3: 1 12 4: 3 14 5: 1 16