Более простой и эффективный вариант base R
будет max.col
после замены элементов NA
на 0
max.col(replace(df2[1:4], is.na(df2[1:4]), 0), 'first')
Или даже
df2$FirstNonNaPosition <- max.col(!is.na(df2[1:4]), "first")
df2$FirstNonNaPosition
#[1] 1 2 3 3 4 4 4 4 4
С tidyverse
возможный вариант: pmap
df2 %>%
mutate(FirstNonNaPosition = pmap_int(.[-5], ~
which.max(!is.na(c(...)))))
Или обернуть max.col
df2 %>%
mutate(FirstNonNaPosition = max.col(!is.na(.[-5]), 'first'))
данные
df2 <- structure(list(X1 = c(100, NA, NA, NA, NA, NA, NA, NA, NA), X2 = c(NA,
10, NA, NA, NA, NA, NA, NA, NA), X3 = c(NA, NA, 1000, 1000, NA,
NA, NA, NA, NA), X4 = c(NA, NA, NA, NA, 25, 50, 10, 40, 50),
FirstNonNaPosition = c(1, 2, 3, 3, 4, 4, 4, 4, 4)),
class = "data.frame", row.names = c(NA,
-9L))