Найти минимальное значение среди строк, включая и ниже данной строки по группе - PullRequest
0 голосов
/ 12 октября 2018

У меня есть фрейм данных, где мне нужно сгруппировать по Mat и найти минимум value в каждой строке из числа строк, включающих и находящихся ниже данной строки.Код показывает тестовые данные и мой код для этого.Поле min_value является желаемым выходом.Хотите знать, если есть tidyverse способ сделать это -

df <- structure(list(Mat = c("A", "A", "A", "A", "A", "A", "B", "B", 
"B", "B", "B", "B"), value = c(11L, 22L, 0L, 22L, 33L, 43L, 108L, 
152L, 0L, 486L, 706L, 830L)), .Names = c("Mat", "value"), class = "data.frame", row.names = c(NA, 
-12L))

group_by(df, Mat) %>%
  mutate(
    min_value = sapply(row_number(), function(a) min(value[a:length(value)]))
  ) %>%
  ungroup()

# A tibble: 12 x 3
   Mat   value min_value
   <chr> <int>     <int>
 1 A        11         0
 2 A        22         0
 3 A         0         0
 4 A        22        22
 5 A        33        33
 6 A        43        43
 7 B       108         0
 8 B       152         0
 9 B         0         0
10 B       486       486
11 B       706       706
12 B       830       830

1 Ответ

0 голосов
/ 12 октября 2018

Вы можете сделать ...

df %>% group_by(Mat) %>% mutate(v = rev(cummin(rev(value))))

# or maybe more 'verse-like
df %>% group_by(Mat) %>% mutate(v = value %>% rev %>% cummin %>% rev)

# or ...
below_min = . %>% rev %>% cummin %>% rev
df %>% group_by(Mat) %>% mutate(v = below_min(value))

Или с data.table (который сам изменяет df) ...

library(data.table)
setDT(df)

df[order(.N:1), v := cummin(value), by=Mat]

Есть аналогичные вопросы и ответыздесь, если кому-то интересно:

...