R и dplyr, используя group_by для запуска кода для группы не работает - PullRequest
0 голосов
/ 06 марта 2019

Прежде всего, я довольно новичок в R, так что я могу не понимать, что происходит здесь, но я застрял в этом куске кода, и мне нужно, чтобы он был быстро исправлен, поэтому спасибо за вашвремя и усилия превентивно.

Я пытаюсь найти точку замерзания на маршрут в год, по сути это произойдет, когда значение КТ превысит порог 9. Дело в том, что я работаю с данными по Арктикезначение КТ начнёт быть выше 9, и мне нужно найти, где оно в первый раз пересекает порог от того, чтобы быть ниже 9 и выше 9. Может быть, есть функции для такого рода локального минимума, но я не знаю, каковы они.

Я попытался сделать длинное выражение для канала, но у меня возникли некоторые проблемы со ссылками на столбцы, поэтому я попытался выделить group_by вне оператора канала, но это тоже не сработало.

РЕДАКТИРОВАТЬ: ЗдесьЭто образец. Я хотел бы получить 1 значение (День года) для Востока 1983 года и Востока 1984 года. Правильные возвращаемые значения - 6 и 18 соответственно.

Route Year  Day_Year    CT
East  1983  1           3
East  1983  2           2
East  1983  3           1
East  1983  4           0
East  1983  5           2
East  1983  6           9.5
East  1984  1           3   
East  1984  3           2
East  1984  9           1
East  1984  10          0
East  1984  14          2
East  1984  18          9.5


library("dplyr")
data_g <- group_by(Sea_Ice, Route, Year)

#Above 9 Freeze-Up
Above_9_A <- 
  #group_by(Sea_Ice, Route, Year) %>%
  data_g %>%
  mutate(row.position = which.min(data_g$CT))%>%
  filter(CT > 9, !SA %in% c("New Ice", "Nilas", "Grey Ice", "Open Water")) %>%
  slice(which.min(Day_Year)) %>%
  mutate(Conc_Threshold = "Above_9")

То, что я сейчас делаю, приводит к нахождению минимума для ВСЕХ маршрутов в течение ВСЕХ лет.

Я просто не знаю, куда идти, спасибо за вашу помощь.

РЕДАКТИРОВАТЬ 2: я удалил фильтры для других столбцов, так какне является частью моей проблемы

1 Ответ

1 голос
/ 06 марта 2019

Что вам нужно сделать, это создать столбец, который будет ИСТИНА, если предыдущее число было меньше 9, а текущее число больше 9. Вот как вы можете это сделать:

data_g %>% group_by(route, year) %>% 
  mutate(freezepoint=(cumsum(CT<9)>0 & CT>=9)) %>% 
  filter(freezepoint)

Или, точнее:

data_g %>% group_by(route,year) %>% slice(which.max(cumsum(CT<9)>0 & CT>=9))

(примечание: это предполагает, что data.frame уже организован по дням)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...