Еще один полностью векторизованный подход, где мы сначала вычисляем средние значения для всех строк.
df1$means <- rowMeans(df1, na.rm = TRUE)
Теперь мы заменим это значение на NA
, если в строке менее 80% * NA
с.
old_cols <- setdiff(names(df1), "means")
NA_rows <- 1 - rowMeans(is.na(df1[, old_cols])) < 0.8
df1[NA_rows, "means"] <- NA
df1
# x y z z1 z2 means
#1 1 1 1 1 1 1
#2 2 2 NA NA NA NA
data
df1 <- structure(list(x = c(1, 2), y = c(1, 2), z = c(1, NA), z1 = c(1,
NA), z2 = c(1, NA)), .Names = c("x", "y", "z", "z1", "z2"), row.names = c(NA,
-2L), class = "data.frame")