Опция с apply
с использованием MARGIN = 1
по строкам
#Select columns based on pattern in the weight column
cols <- grep("^W", names(df))
#Select rows only if there is no NA after the first non-NA is encountered.
df[!apply(df[cols], 1, function(x) any(which(is.na(x)) > which.max(!is.na(x)))), ]
# data W_Y1 W_Y2 W_Y3 W_Y4 W_Y5 W_Y6 W_Y7 W_8 W_9
#2 Ind_2 NA NA NA 82 81 83 84 65 86
Использование аналогичной логики, но с mapply
и max.col
df[mapply(function(x, y) !any(which(is.na(df[x, cols])) > y),1:nrow(df),
max.col(!is.na(df[cols]), ties.method = "first")), ]
Использованиеmax.col
мы находим индекс первого не-NA значения в cols
и затем проверяем, есть ли какое-либо значение в этой строке, которое имеет NA
после этого индекса.
data
Я добавил несколько строк, чтобы сделать лучший пример
df <- structure(list(data = structure(1:4, .Label = c("Ind_1", "Ind_2",
"Ind_3", "Ind_4"), class = "factor"), W_Y1 = c(NA, NA, NA, NA
), W_Y2 = c(NA, NA, NA, 23L), W_Y3 = c(NA, NA, NA, NA), W_Y4 = c(82L,
82L, 82L, 82L), W_Y5 = c(81L, 81L, 81L, 81L), W_Y6 = c(83L, 83L,
83L, 83L), W_Y7 = c(84L, 84L, NA, 84L), W_8 = c(NA, 65L, NA,
12L), W_9 = c(86L, 86L, 86L, 86L)), class = "data.frame", row.names = c(NA,
-4L))
df
# data W_Y1 W_Y2 W_Y3 W_Y4 W_Y5 W_Y6 W_Y7 W_8 W_9
#1 Ind_1 NA NA NA 82 81 83 84 NA 86
#2 Ind_2 NA NA NA 82 81 83 84 65 86
#3 Ind_3 NA NA NA 82 81 83 NA NA 86
#4 Ind_4 NA 23 NA 82 81 83 84 12 86