Consider this matrix Y
.
> (Y <- matrix(c(rep(1:4, each=2), rnorm(8)), 8))
[,1] [,2]
[1,] 1 -0.2452812
[2,] 1 1.3988440
[3,] 2 0.1558103
[4,] 2 0.2677039
[5,] 3 0.4716238
[6,] 3 -0.4442094
[7,] 4 1.9262647
[8,] 4 -0.9932708
I want to replace the values of column one of matrix Y
with the according values of column two of matrix X
.
> (X <- matrix(c(1:4, 4, letters[c(2, 4, 3, 1, 1)]), 5))
[,1] [,2]
[1,] "1" "b"
[2,] "2" "d"
[3,] "3" "c"
[4,] "4" "a"
[5,] "4" "a"
I have this code that technically works both with this example and with my real data.
> cbind(Y, sapply(Y[, 1], function(x) unique(X[X[, 1] == x, 2])))
[,1] [,2] [,3]
[1,] "1" "-0.245281227293266" "b"
[2,] "1" "1.39884404912828" "b"
[3,] "2" "0.155810319624089" "d"
[4,] "2" "0.267703920057734" "d"
[5,] "3" "0.471623773960787" "c"
[6,] "3" "-0.444209371984632" "c"
[7,] "4" "1.92626472214693" "a"
[8,] "4" "-0.993270770582955" "a"
However, since my real data is much larger, this seems to be a pretty slow solution; my real Y
is a 260244 x 10 data frame and the process takes more than 12 seconds.
Is there - and generally - a faster base R solution to recode values of a data frame Y
with the according values of a data frame X
?