R Data Frame Manipulation - Replacing Elements of df2 with the Corresponding Row from df1

Viewed 59

I have two data frames, df1 and df2. I want to replace every element in df2 with the corresponding row from df1. See below:

> df1
  V1 V2 V3 V4 V5 V6
1  7 11 22 35 36 37
2  6 14 17 18 32 38
3  9 17 21 24 33 37

df2
V1 V2 V3
1  1 NA NA
2  2 NA NA
3  3 NA NA
4  1  2 NA
5  1  3 NA
6  2  3 NA
7  1  2  3

I can get pretty close to the desired output by using the following line of code: df1[t(df2),], which generates the following output:

> df1[t(df2),]
     V1 V2 V3 V4 V5 V6
1     7 11 22 35 36 37
NA   NA NA NA NA NA NA
NA.1 NA NA NA NA NA NA
2     6 14 17 18 32 38
NA.2 NA NA NA NA NA NA
NA.3 NA NA NA NA NA NA
3     9 17 21 24 33 37
NA.4 NA NA NA NA NA NA
NA.5 NA NA NA NA NA NA
1.1   7 11 22 35 36 37
2.1   6 14 17 18 32 38
NA.6 NA NA NA NA NA NA
1.2   7 11 22 35 36 37
3.1   9 17 21 24 33 37
NA.7 NA NA NA NA NA NA
2.2   6 14 17 18 32 38
3.2   9 17 21 24 33 37
NA.8 NA NA NA NA NA NA 
1.3   7 11 22 35 36 37
2.3   6 14 17 18 32 38
3.3   9 17 21 24 33 37

However, I would like the output to retain the same amount of rows as df2 (nrow = 7, ncol = 18) and to look like the below:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18]
[1,]    7   11   37   35   36   37   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
[2,]    6   14   32   32   32   38   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
[3,]    9   17   21   24   33   37   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
[4,]    7   11   37   35   36   37    6   14   32    32    32    38    NA    NA    NA    NA    NA    NA
[5,]    7   11   37   35   36   37    9   17   21    24    33    37    NA    NA    NA    NA    NA    NA
[6,]    6   14   32   32   32   38    9   17   21    24    33    37    NA    NA    NA    NA    NA    NA
[7,]    7   11   37   35   36   37    6   14   32    32    32    38     9    17    21    24    33    37
1 Answers

You can use lapply to iterate over columns of df2 and sapply to iterate over columns of df1, subset the values to get combined matrix in the end.

unname(do.call(cbind, lapply(df2, function(x) sapply(df1, function(y) y[x]))))

#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18]
#[1,]    7   11   22   35   36   37   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
#[2,]    6   14   17   18   32   38   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
#[3,]    9   17   21   24   33   37   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
#[4,]    7   11   22   35   36   37    6   14   17    18    32    38    NA    NA    NA    NA    NA    NA
#[5,]    7   11   22   35   36   37    9   17   21    24    33    37    NA    NA    NA    NA    NA    NA
#[6,]    6   14   17   18   32   38    9   17   21    24    33    37    NA    NA    NA    NA    NA    NA
#[7,]    7   11   22   35   36   37    6   14   17    18    32    38     9    17    21    24    33    37

data

df1 <- structure(list(V1 = c(7L, 6L, 9L), V2 = c(11L, 14L, 17L), V3 = c(22L, 
17L, 21L), V4 = c(35L, 18L, 24L), V5 = c(36L, 32L, 33L), V6 = c(37L, 
38L, 37L)), class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(V1 = c(1L, 2L, 3L, 1L, 1L, 2L, 1L), V2 = c(NA, 
NA, NA, 2L, 3L, 3L, 2L), V3 = c(NA, NA, NA, NA, NA, NA, 3L)), 
class = "data.frame", row.names = c(NA, -7L))
Related