Вот векторизованный подход с base R
df[-1] <- df$name[NA^(df[-1] != 0.1) * seq_len(nrow(df))]
df
# name value1 value2 value3
#1 a a <NA> a
#2 b <NA> <NA> <NA>
#3 c <NA> c c
#4 d <NA> d <NA>
#5 e e <NA> e
Тесты
df1 <- df[rep(seq_len(nrow(df)), 1e7), ]
df2 <- copy(df1)
system.time({
cols <- grep("^value", names(df1))
df1[cols] <- lapply(df1[cols], function(x) ifelse(x == 0.1, df1$name, NA))
})
# user system elapsed
# 35.700 4.587 40.615
system.time({
df2[-1] <- df2$name[NA^(df2[-1] != 0.1) * seq_len(nrow(df2))]
})
# user system elapsed
# 21.709 3.886 26.026
данные
df <- structure(list(name = c("a", "b", "c", "d", "e"), value1 = c(0.1,
0, 0.01, 0.12, 0.1), value2 = c(0.9, 0.3, 0.1, 0.1, 0.001), value3 = c(0.1,
0.67, 0.1, 0.2, 0.1)), class = "data.frame", row.names = c(NA,
-5L))