假设我有以下数据:
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
我们可以使用summarise_all或summarise_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)