Мы создаем индекс с col
, а затем заменяем его на основе
m1 <- col(df1[-1]) * df1[-1]
i1 <- m1 != 0
df1[-1][i1] <- rep(colnames(m1), each = nrow(m1))[i1]
df1
# Names 35 40 45 50 55 60
#1 a 35 0 45 0 0 0
#2 b 0 0 0 50 0 0
#3 c 0 40 0 50 55 0
#4 d 35 0 0 0 0 60
ПРИМЕЧАНИЕ. Это также должно работать, когда имена столбцов не являются числовыми.Лучше не иметь имен столбцов с именами, начинающимися с цифры
. Или, если она числовая, мы можем просто умножить после репликации
df1[-1] <- df1[-1] * as.numeric(names(df1)[-1])[col(df1[-1])]
или использовать for
цикл
for(i in 2:ncol(df1)) df1[[i]][df1[[i]]==1] <- as.numeric(names(df1)[i])
данные
df1 <- structure(list(Names = c("a", "b", "c", "d"), `35` = c(1L, 0L,
0L, 1L), `40` = c(0L, 0L, 1L, 0L), `45` = c(1L, 0L, 0L, 0L),
`50` = c(0L, 1L, 1L, 0L), `55` = c(0L, 0L, 1L, 0L), `60` = c(0L,
0L, 0L, 1L)), class = "data.frame", row.names = c(NA, -4L
))