Q: Как фильтровать, используя среднее значение в R? - PullRequest
0 голосов
/ 28 апреля 2020

dput моих данных таков:

structure(list(year = c(2009, 2009, 2009, 2009, 2009, 2009, 2009, 
2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009), month = c(7, 
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7), day = c(1, 1, 1, 1, 
1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3), fivemin = c(1, 2, 3, 4, 5, 
1, 2, 3, 4, 5, 1, 2, 3, 4, 5), rrp_nsw = c(16.9, 17.7, -17.7, 
-16.7, -15.6, 13.7, 13.7, 13.9, 13.8, 13.7, -13.7, 13.8, 17.6, 
17.7, 15.8), rrp_qld = c(17.6, 18.8, 18.6, 18.6, 17.6, -15.7, 
15.8, 16.1, 16, -16.3, 15.8, 16, 17.6, -17.6, 16), rrp_sa = c(16.7, 
17.8, 18.1, 17.6, 16.3, 12, 11.9, 12.1, 12.2, 11.6, 11.9, 12.1, 
17.3, 17.3, 15.1), rrp_tas = c(15.7, 16.1, 15.9, -14.3, 13.2, 
11.1, 11.1, -11.2, 11.2, 10.6, 11, 11.2, 16.5, 16.8, 15), rrp_vic = c(15.5, 
15.5, -15.4, -12.8, 11.8, 12.9, 12.9, 12.9, 12.8, -12.6, 12.7, 
12.9, 17.1, 17.4, 15.5)), row.names = c(NA, -15L), class = c("tbl_df", 
"tbl", "data.frame"))

Мои данные содержат ежедневные наблюдения за ценами на электроэнергию. Моя цель состоит в том, чтобы заменить отрицательные цены rrp_nsw, rrp_qld, rrp_sa, rrp_tas и rrp_vic их среднесуточными, однако для некоторых групп среднее значение остается отрицательным или нулевым, поэтому я хочу исключить вся группа, это означает, что я хочу удалить все наблюдения дня (1, 2 или 3). Например, среднесуточное значение (день 1) для rrp_nsw´ составляет -3,08, затем я хочу исключить эти 5 строк.

Я пытался использовать пакет dplyr, но потерпел неудачу с моим кодом, который является следующим:

Data_modified<-Data%>%
  group_by(year, month, day)%>%
  mutate_at(vars(starts_with("rrp")),
            funs(replace(., .<=0, 
                        (mean(., na.rm=TRUE)))
           ))%>%
  filter(
    any(mean(., na.rm=TRUE)<=0)
  )

Ответы [ 2 ]

3 голосов
/ 28 апреля 2020

Это должно сделать работу:

library(dplyr)

Data %>%
  group_by(year, month, day) %>%
  filter_at(vars(starts_with("rrp")), all_vars(mean(.) > 0)) %>%
  mutate_at(vars(starts_with("rrp")), ~ if_else(. < 0, mean(.), .))

Это дает:

# A tibble: 10 x 9
# Groups:   year, month, day [2]
    year month   day fivemin rrp_nsw rrp_qld rrp_sa rrp_tas rrp_vic
   <dbl> <dbl> <dbl>   <dbl>   <dbl>   <dbl>  <dbl>   <dbl>   <dbl>
 1  2009     7     2       1    13.7    3.18   12     11.1    12.9 
 2  2009     7     2       2    13.7   15.8    11.9   11.1    12.9 
 3  2009     7     2       3    13.9   16.1    12.1    6.56   12.9 
 4  2009     7     2       4    13.8   16      12.2   11.2    12.8 
 5  2009     7     2       5    13.7    3.18   11.6   10.6     7.78
 6  2009     7     3       1    10.2   15.8    11.9   11      12.7 
 7  2009     7     3       2    13.8   16      12.1   11.2    12.9 
 8  2009     7     3       3    17.6   17.6    17.3   16.5    17.1 
 9  2009     7     3       4    17.7    9.56   17.3   16.8    17.4 
10  2009     7     3       5    15.8   16      15.1   15      15.5 
0 голосов
/ 28 апреля 2020

Один из способов будет:

library(dplyr)

df %>%
  tidyr::pivot_longer(cols = starts_with('rrp')) %>%
  group_by(year, month, day, name) %>%
  summarise(flag = mean(value) > 0) %>%
  filter(all(flag)) %>%
  distinct() %>%
  left_join(df, c('year', 'month', 'day'))


#    year month   day fivemin rrp_nsw rrp_qld rrp_sa rrp_tas rrp_vic
#   <dbl> <dbl> <dbl>   <dbl>   <dbl>   <dbl>  <dbl>   <dbl>   <dbl>
# 1  2009     7     2       1    13.7   -15.7   12      11.1    12.9
# 2  2009     7     2       2    13.7    15.8   11.9    11.1    12.9
# 3  2009     7     2       3    13.9    16.1   12.1   -11.2    12.9
# 4  2009     7     2       4    13.8    16     12.2    11.2    12.8
# 5  2009     7     2       5    13.7   -16.3   11.6    10.6   -12.6
# 6  2009     7     3       1   -13.7    15.8   11.9    11      12.7
# 7  2009     7     3       2    13.8    16     12.1    11.2    12.9
# 8  2009     7     3       3    17.6    17.6   17.3    16.5    17.1
# 9  2009     7     3       4    17.7   -17.6   17.3    16.8    17.4
#10  2009     7     3       5    15.8    16     15.1    15      15.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...