Создание DF в R путем выбора строк на основе наибольшего локального значения в одном столбце

У меня есть данные о почве из gSSURGO, перечисленные с профилями, с каждым профилем, содержащим горизонты на последовательных глубинах. Таким образом,

> chorizon <- read.csv("chorizonexcel.csv", header = T)
> 
> chorizon [1:10,1:8]
 OBJECTID hzname desgndisc desgnmaste desgnmas_1 desgnvert hzdept_l hzdept_r
1 1 A 0 A <na> 0 0 0
2 2 Bk 0 B <na> 0 0 18
3 3 2BCk 2 BC <na> 0 0 64
4 4 A 0 A <na> 0 0 0
5 5 Bk 0 B <na> 0 0 8
6 6 Bkkm 0 B <na> 0 0 18
7 7 CBk 0 CB <na> 0 0 71
8 8 A 0 A <na> 0 0 0
9 9 Bk 0 B <na> 0 0 6
10 10 Bkkm 0 B <na> 0 0 21
</na></na></na></na></na></na></na></na></na></na>

Самые низкие глубины профиля в chorizon$hzdept_r всегда самые большие и всегда идут до 0 верхней глубины следующего горизонта. (Глубина профиля 1: 0, 18, 64; глубина профиля 2: 0, 8, 18, 71 и т.д.);

Я пытаюсь получить:

OBJECTID hzname desgndisc desgnmaste desgnmas_1 desgnvert hzdept_l hzdept_r
3 3 2BCk 2 BC <na> 0 0 64
7 7 CBk 0 CB <na> 0 0 71
10 10 Bkkm 0 B <na> 0 0 21
</na></na></na>

Я пытаюсь создать цикл для создания нового df только самых низких горизонтов.

Если об этом уже ответили, я не нашел его в течение последних 6 часов. Прошу прощения, если это слишком простой вопрос.

2 ответа

Несколько вариантов:

chorDT[c(tail(hzdept_r==0, -1), TRUE)]
chorDT[c(diff(hzdept_r) < 0), TRUE)]
etc..

Вот полное решение, использующее data.table:

library(data.table)
chorDT <- data.table(chorizon)

chorDT[c(tail(hzdept_r==0, -1), TRUE)]

 OBJECTID hzname desgndisc desgnmaste desgnmas_1 desgnvert hzdept_l hzdept_r
1: 3 2BCk 2 BC <na> 0 0 64
2: 7 CBk 0 CB <na> 0 0 71
3: 10 Bkkm 0 B <na> 0 0 21
</na></na></na>


x = chorizon$hzdept_r
n = length(x)
pts = which(diff(x)<0)
if(x[n]>x[n-1]) pts = c(pts,n)
chorizon[pts,]

licensed under cc by-sa 3.0 with attribution.