Поскольку мы меняем только значения столбца с 6:10, просто зациклите их и замените их значением 4-го столбца
df[6:10] <- lapply(df[6:10], function(x) ifelse(x == "0/0", df[[4]], x))
Или это можно сделать без цикла, создав логическую матрицу, затем реплицировать 4-й столбец, чтобы сделать длины равными, и назначить элементам (на основе 'i1') значение 4-го столбца
i1 <- df[6:10] == "0/0"
df[6:10][i1] <- df$V4[row(df[6:10])][i1]
В коде OP логическое выражение используется в if
, но его длина больше 1, поэтому лучше использовать ifelse
вместо if/else
for(i in names(df)[6:10]) {
df[,i] <- ifelse(df[,i] == "0/0", df[[4]], df[,i])
}
df
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
#1 chr1A 63248 . A G A A A ./. A
#2 chr1A 80950 . A C 1/1 A ./. A A
#3 chr1A 81080 . C G C C C ./. C
#4 chr1A 81084 . C T 0/1 C C ./. C