In the following example, res has 90 rows and 6 columns and includes several NAs. There is also a matrix, tmpCombs with 6 rows and 2 columns. Each row of tmpCombs corresponds to a group of 15 rows in res (6*15=90). The number of its columns (2) means that I must replace 2 of the existing NA's in each row of res with a specified character (say "B"). (It is ensured that there will be at least 2 NAs in each row).
For example, the values 2 and 4 in row 5 of tmpCombs mean that for each row in the group 61-75 (4*15+1):(5*15) of res, the 2nd and 4th appearing NAs must be replaced with "B".
I can do the job using nested for loops, but I am looking for a faster/massive way to perform those replacements (perhaps using dplyr or data.table), because my code gets more and more slow, as the dimensions increase.
An example of res and tmpCombs is given below. There is also a 2nd dataframe, res2, which contains the desired output.
res <- structure(list(X1 = c("A", "A", "A", "A", "A", NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, "A", "A", "A", "A", "A", NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, "A", "A", "A", "A", "A", NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, "A", "A", "A", "A", "A", NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, "A", "A", "A", "A", "A",
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "A", "A", "A", "A", "A",
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), X2 = c("A", NA, NA,
NA, NA, "A", "A", "A", "A", NA, NA, NA, NA, NA, NA, "A", NA,
NA, NA, NA, "A", "A", "A", "A", NA, NA, NA, NA, NA, NA, "A",
NA, NA, NA, NA, "A", "A", "A", "A", NA, NA, NA, NA, NA, NA, "A",
NA, NA, NA, NA, "A", "A", "A", "A", NA, NA, NA, NA, NA, NA, "A",
NA, NA, NA, NA, "A", "A", "A", "A", NA, NA, NA, NA, NA, NA, "A",
NA, NA, NA, NA, "A", "A", "A", "A", NA, NA, NA, NA, NA, NA),
X3 = c(NA, "A", NA, NA, NA, "A", NA, NA, NA, "A", "A", "A",
NA, NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, NA, "A", "A",
"A", NA, NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, NA, "A",
"A", "A", NA, NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, NA,
"A", "A", "A", NA, NA, NA, NA, "A", NA, NA, NA, "A", NA,
NA, NA, "A", "A", "A", NA, NA, NA, NA, "A", NA, NA, NA, "A",
NA, NA, NA, "A", "A", "A", NA, NA, NA), X4 = c(NA, NA, "A",
NA, NA, NA, "A", NA, NA, "A", NA, NA, "A", "A", NA, NA, NA,
"A", NA, NA, NA, "A", NA, NA, "A", NA, NA, "A", "A", NA,
NA, NA, "A", NA, NA, NA, "A", NA, NA, "A", NA, NA, "A", "A",
NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, "A", NA, NA, "A",
"A", NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, "A", NA, NA,
"A", "A", NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, "A",
NA, NA, "A", "A", NA), X5 = c(NA, NA, NA, "A", NA, NA, NA,
"A", NA, NA, "A", NA, "A", NA, "A", NA, NA, NA, "A", NA,
NA, NA, "A", NA, NA, "A", NA, "A", NA, "A", NA, NA, NA, "A",
NA, NA, NA, "A", NA, NA, "A", NA, "A", NA, "A", NA, NA, NA,
"A", NA, NA, NA, "A", NA, NA, "A", NA, "A", NA, "A", NA,
NA, NA, "A", NA, NA, NA, "A", NA, NA, "A", NA, "A", NA, "A",
NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, "A", NA, "A", NA,
"A"), X6 = c(NA, NA, NA, NA, "A", NA, NA, NA, "A", NA, NA,
"A", NA, "A", "A", NA, NA, NA, NA, "A", NA, NA, NA, "A",
NA, NA, "A", NA, "A", "A", NA, NA, NA, NA, "A", NA, NA, NA,
"A", NA, NA, "A", NA, "A", "A", NA, NA, NA, NA, "A", NA,
NA, NA, "A", NA, NA, "A", NA, "A", "A", NA, NA, NA, NA, "A",
NA, NA, NA, "A", NA, NA, "A", NA, "A", "A", NA, NA, NA, NA,
"A", NA, NA, NA, "A", NA, NA, "A", NA, "A", "A")), .Names = c("X1",
"X2", "X3", "X4", "X5", "X6"), row.names = c(NA, -90L), class = "data.frame")
tmpCombs <- structure(c(1L, 1L, 1L, 2L, 2L, 3L, 2L, 3L, 4L, 3L, 4L, 4L), .Dim = c(6L,
2L))
res2 <- structure(list(X1 = c("A", "A", "A", "A", "A", "B", "B", "B",
"B", "B", "B", "B", "B", "B", "B", "A", "A", "A", "A", "A", "B",
"B", "B", "B", "B", "B", "B", "B", "B", "B", "A", "A", "A", "A",
"A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "A", "A",
"A", "A", "A", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "A", "A",
"A", "A", "A", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "A", "A",
"A", "A", "A", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), X2 = c("A",
"B", "B", "B", "B", "A", "A", "A", "A", "B", "B", "B", "B", "B",
"B", "A", "B", "B", "B", "B", "A", "A", "A", "A", NA, NA, NA,
NA, NA, NA, "A", "B", "B", "B", "B", "A", "A", "A", "A", NA,
NA, NA, NA, NA, NA, "A", NA, NA, NA, NA, "A", "A", "A", "A",
"B", "B", "B", "B", "B", "B", "A", NA, NA, NA, NA, "A", "A",
"A", "A", "B", "B", "B", "B", "B", "B", "A", NA, NA, NA, NA,
"A", "A", "A", "A", NA, NA, NA, NA, NA, NA), X3 = c("B", "A",
"B", "B", "B", "A", "B", "B", "B", "A", "A", "A", NA, NA, NA,
"B", "A", NA, NA, NA, "A", NA, NA, NA, "A", "A", "A", "B", "B",
"B", "B", "A", NA, NA, NA, "A", NA, NA, NA, "A", "A", "A", NA,
NA, NA, NA, "A", "B", "B", "B", "A", "B", "B", "B", "A", "A",
"A", "B", "B", "B", NA, "A", "B", "B", "B", "A", "B", "B", "B",
"A", "A", "A", NA, NA, NA, NA, "A", NA, NA, NA, "A", NA, NA,
NA, "A", "A", "A", "B", "B", "B"), X4 = c("B", "B", "A", NA,
NA, "B", "A", NA, NA, "A", NA, NA, "A", "A", NA, NA, NA, "A",
"B", "B", NA, "A", "B", "B", "A", "B", "B", "A", "A", NA, NA,
NA, "A", NA, NA, NA, "A", NA, NA, "A", NA, NA, "A", "A", "B",
"B", "B", "A", "B", "B", "B", "A", "B", "B", "A", "B", "B", "A",
"A", NA, "B", "B", "A", NA, NA, "B", "A", NA, NA, "A", NA, NA,
"A", "A", "B", NA, NA, "A", "B", "B", NA, "A", "B", "B", "A",
"B", "B", "A", "A", "B"), X5 = c(NA, NA, NA, "A", NA, NA, NA,
"A", NA, NA, "A", NA, "A", NA, "A", "B", "B", "B", "A", NA, "B",
"B", "A", NA, "B", "A", NA, "A", NA, "A", NA, NA, NA, "A", "B",
NA, NA, "A", "B", NA, "A", "B", "A", "B", "A", "B", "B", "B",
"A", NA, "B", "B", "A", NA, "B", "A", NA, "A", NA, "A", NA, NA,
NA, "A", "B", NA, NA, "A", "B", NA, "A", "B", "A", "B", "A",
"B", "B", "B", "A", "B", "B", "B", "A", "B", "B", "A", "B", "A",
"B", "A"), X6 = c(NA, NA, NA, NA, "A", NA, NA, NA, "A", NA, NA,
"A", NA, "A", "A", NA, NA, NA, NA, "A", NA, NA, NA, "A", NA,
NA, "A", NA, "A", "A", "B", "B", "B", "B", "A", "B", "B", "B",
"A", "B", "B", "A", "B", "A", "A", NA, NA, NA, NA, "A", NA, NA,
NA, "A", NA, NA, "A", NA, "A", "A", "B", "B", "B", "B", "A",
"B", "B", "B", "A", "B", "B", "A", "B", "A", "A", "B", "B", "B",
"B", "A", "B", "B", "B", "A", "B", "B", "A", "B", "A", "A")), .Names = c("X1",
"X2", "X3", "X4", "X5", "X6"), row.names = c(NA, -90L), class = "data.frame")