Чтобы ответить на оба ваших вопроса, нам нужно создать новый образец данных:
set.seed(123)
test <- data.frame(Group = rep(c("A", "B"), 5),
Val = replicate(10, sample(c(-3:3), 1, replace = TRUE)))
Как сказал @Jon Spring, вы можете получить среднее значение для каждой группы без нулей, отфильтровав их:
require(tidyverse)
test %>%
group_by(Group) %>%
filter(Val != 0) %>%
summarise(Mean = mean(Val))
Чтобы получить среднее значение без нулей для каждой группы и для знака - мы можем создать новую переменную для знака, а теперь group_by
для группы и знака:
test %>%
mutate(sign = ifelse(Val > 0, "positive", "negative")) %>%
group_by(Group, sign) %>%
filter(Val != 0) %>%
summarise(Mean = mean(Val))
Результат:
Group sign Mean
<fct> <chr> <dbl>
1 A negative -1
2 A positive 3
3 B negative -3
4 B positive 2.67