Исходя из условия, мы можем использовать условие if/else
с использованием размера группы (n()
), и если all
значение1 меньше -2 или больше 2, то получить median
значения «значение3» или else
вернуть 'значение2'
library(dplyr)
df1 %>%
group_by(g) %>%
mutate(value4 = if(n() > 2 & (all(value1 > 2)| all(value1 < -2))) median(value3)
else value2)
# A tibble: 12 x 5
# Groups: g [4]
# g value1 value2 value3 value4
# <int> <dbl> <int> <int> <dbl>
# 1 1 1.1 8 1 8
# 2 1 1.2 8 1 8
# 3 1 1.3 9 1 9
# 4 2 3 10 5 5
# 5 2 4 11 5 5
# 6 2 5 0 4 5
# 7 2 6 1 6 5
# 8 3 -3 2 5 5
# 9 3 -4 3 10 5
#10 3 -5 4 0 5
#11 4 -3 1 0 1
#12 4 -4 1 0 1
данные
df1 <- structure(list(g = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L,
4L, 4L), value1 = c(1.1, 1.2, 1.3, 3, 4, 5, 6, -3, -4, -5, -3,
-4), value2 = c(8L, 8L, 9L, 10L, 11L, 0L, 1L, 2L, 3L, 4L, 1L,
1L), value3 = c(1L, 1L, 1L, 5L, 5L, 4L, 6L, 5L, 10L, 0L, 0L,
0L)), class = "data.frame", row.names = c(NA, -12L))