Проблемы с группировкой, мутацией и отображением ожидаемых значений в R - PullRequest
0 голосов
/ 07 июня 2019

У меня проблема с группировкой.Я пытаюсь сгруппировать значения из столбца A, и в то же время получить каждое значение столбца C и умножить на 2, а для каждого сгруппированного значения из столбца A рассчитать среднее и, в то же время, выбрать только эти значения из столбцаЭто среднее значение выше 75. После этого я хочу показать блокпост, используя группирование каждого значения из столбца C по столбцу B.

Я просто приведу пример.У меня есть такой фрейм данных:

df=data.frame((cbind(c('01-May', '01-May', '01-May', '02-May', '02-May', '02-May','03-May','03-May','03-May','04-May','04-May','04-May')
      ,c('15:00', '16:00','17:00','15:00','16:00','17:00','15:00','16:00','17:00','15:00' ,'16:00','17:00')
      ,c(25,54,34,28,38,48,36,25,34,04,59,22))))

Данные выглядят так:

A      B     C
01-May 15:00 25
01-May 16:00 54
01-May 17:00 34
02-May 15:00 28
02-May 16:00 38
02-May 17:00 48
03-May 15:00 36
03-May 16:00 25
03-May 17:00 34
04-May 15:00 04
04-May 16:00 59
04-May 17:00 22

Теперь я хочу умножить столбец C на 2.

A      B     C
01-May 15:00 50
01-May 16:00 108
01-May 17:00 68
02-May 15:00 56
02-May 16:00 76
02-May 17:00 96
03-May 15:00 72
03-May 16:00 50
03-May 17:00 68
04-May 15:00 08
04-May 16:00 118
04-May 17:00 44

ДалееЯ хотел бы видеть рассчитанное среднее значение для каждого дня (столбец A) и выбрать только те, которые означают, что значение выше 75, поэтому:

A     C
01-May 75.3
02-May 76

Наконец, я хотел бы показать только эти дни в boxplot(df$B~df$C)чтобы увидеть, как выглядят прямоугольники для каждого часа (столбец B).

Как я могу группировать таким образом?

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Этот подход

  • группируется по day для расчета среднесуточного значения,
  • сравнивает среднесуточное значение с пороговым значением 75 и сохраняет результат до keep_day и
  • filter s строк, относящихся к дням выше этого порога.

Даже если баллы ниже порогового значения, они отображаются в графическом окне, если они были получены в день, среднее значение которого было выше порогового значения.

library(magrittr)
ds <- structure(list(day = c("01-May", "01-May", "01-May", "02-May", 
  "02-May", "02-May", "03-May", "03-May", "03-May", "04-May", "04-May", 
  "04-May"), time = c("15:00", "16:00", "17:00", "15:00", "16:00", 
  "17:00", "15:00", "16:00", "17:00", "15:00", "16:00", "17:00"
  ), score = c(25, 54, 34, 28, 38, 48, 36, 25, 34, 4, 59, 22)), row.names = c(NA, 
  -12L), class = c("tbl_df", "tbl", "data.frame"))

ds <- 
  ds %>% 
  dplyr::mutate(
    score  = score * 2
  ) %>% 
  dplyr::group_by(day) %>% 
  dplyr::mutate(
    score_mean_daily    = mean(score),
    keep_day            = (75 < score_mean_daily)
  ) %>% 
  dplyr::ungroup() %>% 
  dplyr::filter(keep_day)

boxplot(ds$score ~ ds$day)

Результаты

# A tibble: 6 x 5
  day    time  score score_mean_daily keep_day
  <chr>  <chr> <dbl>            <dbl> <lgl>   
1 01-May 15:00    50             75.3 TRUE    
2 01-May 16:00   108             75.3 TRUE    
3 01-May 17:00    68             75.3 TRUE    
4 02-May 15:00    56             76   TRUE    
5 02-May 16:00    76             76   TRUE    
6 02-May 17:00    96             76   TRUE    

enter image description here

1 голос
/ 07 июня 2019

Попробуйте:

days <- c('01-May', '01-May', '01-May', '02-May', '02-May', '02-May','03-May','03-May','03-May','04-May','04-May','04-May')
hours <- c('15:00', '16:00','17:00','15:00','16:00','17:00','15:00','16:00','17:00','15:00' ,'16:00','17:00')
scores <- c(25,54,34,28,38,48,36,25,34,04,59,22)

df <- data.frame(days, hours, scores)
df

df <- data.frame(days, hours, scores = scores*2)
df

df <- filter(df, df$scores > 75)
df

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