R: найти год, когда одно значение выше другого по категории - PullRequest
0 голосов
/ 26 июня 2018

У меня есть фрейм данных, содержащий столбцы местоположения (loc), расстояния в пределах местоположения (dist), значения (cumRate) и года (year).

Я хотел бы сравнить показатели расстояний, определить, какое из них выше, и найти год, когда показатели в одной зоне станут выше, чем в другой, как показано ниже (в год 2 расстояние «100» было выше, чем расстояние "нпр")

[![enter code here][1]][1]

Это кажется легким, но я не знаю, с чего начать ... Спасибо за ваши предложения!


Фиктивные данные:

loc = rep(c("a","b"), each = 6)
dist = rep(c("npr", "100", "npr", "100"), each = 3)
cumRate = c(0,0,4,0,1,2,0,0,1,3,5,7)
year = rep(c(1,2,3), 4)

df = data.frame(loc, dist, cumRate, year)



       loc dist cumRate year
1    a  npr       0    1
2    a  npr       0    2
3    a  npr       4    3
4    a  100       0    1
5    a  100       1    2
6    a  100       2    3
7    b  npr       0    1
8    b  npr       0    2
9    b  npr       1    3
10   b  100       3    1
11   b  100       5    2
12   b  100       7    3

Данные графика

windows()
ggplot(df, aes(x = year,
               y = cumRate,
               fill = dist,
               colour = dist)) +
  geom_line() +
  theme_bw() +
  facet_grid(.~ loc)

enter image description here

Желаемый вывод

outDf

  loc dist  year
   a  100       2
   b  100       1

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вот метод без распространения:

library(dplyr)
df %>% group_by(loc, year) %>%
    filter(max(cumRate) != min(cumRate)) %>%
    arrange(loc, year, desc(cumRate)) %>%
    group_by(loc) %>%
    slice(1)
# # A tibble: 2 x 4
# # Groups:   loc [2]
#      loc   dist cumRate  year
#   <fctr> <fctr>   <dbl> <dbl>
# 1      a    100       1     2
# 2      b    100       3     1

Сначала мы удаляем годы, в которых нет изменений в cumRate, затем сортируем данные по местоположению, году и скорости спуска по убыванию и берем первую строку в каждом местоположении.

0 голосов
/ 26 июня 2018

Я думаю, вам нужно отключить столбец dist:

library(dplyr)
library(tidyr)

df %>% 
  spread(dist, cumRate) %>%
  mutate(higher_dist = case_when(
    `100` > npr ~ '100',
    npr > `100` ~ 'npr',
    TRUE ~ 'equal')
  ) %>%
  filter(npr != `100`) %>%
  group_by(loc) %>%
  arrange(year) %>%
  slice(1)

  loc    year `100`   npr higher_dist
  <fct> <dbl> <dbl> <dbl> <chr>      
1 a         2     1     0 100        
2 b         1     3     0 100 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...