/ / Extrahovať maximálnu hodnotu valcovania na základe hodnoty stĺpca - r, dataframe

Maximálna hodnota valcovania extraktu na základe hodnoty stĺpca - r, dátového rámca

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ď č. 1

V 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