Вот базовая опция R с использованием mapply
и replace
df[, -c(1, ncol(df))] <- t(mapply(
function(x, y) replace(x, is.na(x) & seq_along(x) >= y, 0),
as.data.frame(t(df[, -c(1, ncol(df))])),
unlist(df[ncol(df)])))
df
# id x1 x2 x3 x4 x5 x6 x7 pos
#1 1 1 2 1 5 0 0 0 1
#2 2 NA NA 0 4 2 2 3 3
#3 3 NA 0 2 4 2 2 3 2
#4 4 NA 0 7 4 2 2 3 2
#5 5 0 0 0 4 2 2 3 1
Различные t()
необходимы, потому что mapply
применяет функцию по столбцу, и мы хотели бы обработать df
по строкам.
Обновление
Вот более короткая и быстрая версия, позволяющая избежать вызова mapply
и использовать прямое индексирование
# df2 is the x1...x7 block of df
df2 <- df[, -c(1, ncol(df))]
df2[is.na(df2) & t(apply(df2, 1, seq_along)) == df[, ncol(df)]] <- 0
df[, -c(1, ncol(df))] <- df2
df
# id x1 x2 x3 x4 x5 x6 x7 pos
#1 1 1 2 1 5 NA NA NA 1
#2 2 NA NA 0 4 2 2 3 3
#3 3 NA 0 2 4 2 2 3 2
#4 4 NA 0 7 4 2 2 3 2
#5 5 0 NA NA 4 2 2 3 1
Примерданные
df <- read.table(text =
"id x1 x2 x3 x4 x5 x6 x7 pos
1 1 2 1 5 NA NA NA 1
2 NA NA NA 4 2 2 3 3
3 NA NA 2 4 2 2 3 2
4 NA NA 7 4 2 2 3 2
5 NA NA NA 4 2 2 3 1", header = T)