library(tidyverse)
set.seed(42)
(fakedata0 <- tibble(
v1 = sample(c(NA_real_, 1:5), size = 10, replace = TRUE),
v2 = sample(c(NA_real_, 1:5), size = 10, replace = TRUE),
v3 = sample(c(NA_real_, 1:5), size = 10, replace = TRUE),
v4 = sample(c(1:5), size = 10, replace = TRUE)
))
(fakedata <- mutate(fakedata0, v4=
ifelse(is.na(rowMeans(cbind(v1, v2, v3))) ,
v4,
NA_real_)))
# the calculation
(result <- fakedata %>%
mutate(average_of_3_or_NA = ifelse(rowSums(is.na(cbind(v1, v2, v3, v4))) > 1,
NA,
rowMeans(cbind(v1, v2, v3, v4),na.rm = TRUE ))
))
# A tibble: 10 x 5
v1 v2 v3 v4 average_of_3_or_NA
<dbl> <dbl> <dbl> <dbl> <dbl>
1 NA NA 3 2 NA
2 4 4 4 NA 4
3 NA 5 4 2 3.67
4 NA 3 4 4 3.67
5 1 1 3 NA 1.67
6 3 1 1 NA 1.67
7 1 2 3 NA 2
8 1 NA 2 4 2.33
9 NA NA 1 5 NA
10 3 2 NA 4 3