在忽略dplyr链中特定的一组值时取平均值

Par*_*gue 3 r dplyr

假设我有以下数据:

values = data.frame(score = c(1, 2, 3, 4, 5, 999, 2, 3, 999, 4),
                    score_2 = c(1, 4, 8 , 4, 999, 2, 3, 2, 1, 0))
values %>% 
  summarize(mean_score = mean(score),
            mean_score_2 = mean(score_2))
Run Code Online (Sandbox Code Playgroud)

我想计算数据集中各列的均值,而忽略值“ 999”。

所以我可以做这样的事情:

values %>% 
  filter_all(all_vars(!grepl('999',.))) %>%
  summarize(mean_score = mean(score),
            mean_score_2 = mean(score_2))
Run Code Online (Sandbox Code Playgroud)

但这会从score和score_2中删除第6、9和5行(因为这是999的位置)。在忽略某些值而又不消除整个行的情况下,如何有选择地计算均值?

对于score结果输出应为3,对于score_2结果输出应为2.78

akr*_*run 5

我们可以使用summarise_allsummarise_if(仅用于选择numeric列),并通过比较运算符(!=)选择列值。

library(dplyr)
values %>%
     summarise_all(~ mean(.[.!= 999]))
Run Code Online (Sandbox Code Playgroud)

如果有多个值,请使用%in%并取反!

values %>%
     summarise_all(~ mean(.[! . %in% c(999, 994)]))
Run Code Online (Sandbox Code Playgroud)

  • 或`values%>%summarise_at(vars(starts_with(“ score”)),〜mean(ifelse(。== 999,NA,。),na.rm = T)) (3认同)