используйте разрез в R так, чтобы были включены непревзойденные интервалы - PullRequest
1 голос
/ 14 апреля 2019

У меня есть такой набор данных:

sum_col   city    scen    model   time_period   chill_season
110.02     NY      RCP_8   bcc     2076_2099     season_2085_2086
91.26      NY      RCP_8   bcc     2076_2099     season_2086_2087
91.05      NY      RCP_8   bcc     2076_2099     season_2087_2088
74.96      NY      RCP_8   bcc     2076_2099     season_2088_2089
77.97      NY      RCP_8   bcc     2076_2099     season_2089_2090
109.05     NY      RCP_8   bcc     2076_2099     season_2090_2091

Я хочу cut столбец sum_col и подсчитать, сколько раз значения попадают в каждый интервал bks = c(-300, seq(20, 75, 5), 300).

Однако, когда я пытаюсь сделать следующее:

result <- dt %>%
          mutate(thresh_range = cut(sum_col, breaks = bks)) %>%
          group_by(time_period, thresh_range, model, scen, city) %>%
          summarize(no_years = n_distinct(chill_season, na.rm = FALSE)) %>% 
          data.table()

мой результат выглядит так:

time_period   thresh_range  model   scen    city   no_years
  2076_2099      (70,75]      bcc   RCP_8     NY     1
  2076_2099     (75,300]      bcc   RCP_8     NY     5

Итак, интервалы меньше 70, например (20, 25), (25, 30), не создаются (потому что в данных нет ни одной строки, попадающей в эти интервалы).

Можно ли в любом случае сказать cut, возвращать ноль для этих интервалов?

Обратите вниманиеопять же, что строка, похожая на следующую:

 a_value_leass_than_70_here  NY   RCP_8  bcc 2076_2099  chill_2076_2077

, чье значение sum_col меньше 70, не существует в данных, однако мне было интересно, возможно ли такоеИз существующих данных cut может создать 0 или NA, который сообщает нам температуру Нью-Йорка, причем эти параметры действительно не попадают в интервал (20, 25).

Суть в том, что я хочучтобы увидеть, сколько лет каждый город с заданным набором параметров (model, scen, etc) попадает в каждый интервал, (20, 25), (25,30), etc.,

Если какое-либо предложение, отличное от cut, работает, то это тоже замечательно.

1 Ответ

2 голосов
/ 14 апреля 2019

Вы можете использовать функцию complete из пакета tidyr для создания NA строк для пропущенных комбинаций данных:

library(tidyr)
result <- dt %>%
          mutate(thresh_range = cut(sum_col, breaks = bks)) %>%
          complete(time_period, thresh_range, model, scen, city) %>%
          group_by(time_period, thresh_range, model, scen, city) %>%
          summarize(no_years = n_distinct(chill_season, na.rm = TRUE)) 
result
# # A tibble: 13 x 6
# # Groups:   time_period, thresh_range, model, scen [?]
#    time_period thresh_range model scen  city  no_years
#    <chr>       <fct>        <chr> <chr> <chr>    <int>
#  1 2076_2099   (-300,20]    bcc   RCP_8 NY           0
#  2 2076_2099   (20,25]      bcc   RCP_8 NY           0
#  3 2076_2099   (25,30]      bcc   RCP_8 NY           0
#  4 2076_2099   (30,35]      bcc   RCP_8 NY           0
#  5 2076_2099   (35,40]      bcc   RCP_8 NY           0
#  6 2076_2099   (40,45]      bcc   RCP_8 NY           0
#  7 2076_2099   (45,50]      bcc   RCP_8 NY           0
#  8 2076_2099   (50,55]      bcc   RCP_8 NY           0
#  9 2076_2099   (55,60]      bcc   RCP_8 NY           0
# 10 2076_2099   (60,65]      bcc   RCP_8 NY           0
# 11 2076_2099   (65,70]      bcc   RCP_8 NY           0
# 12 2076_2099   (70,75]      bcc   RCP_8 NY           1
# 13 2076_2099   (75,300]     bcc   RCP_8 NY           5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...