Довольно простой (и быстрый!) Альтернативой является использование матрицы для индексации в вашей матрице:
# Your data
d <- data.frame(color=c('red','blue','blue','green'), shape=c('circle','square','circle','sphere'))
m <- matrix(1:9, 3,3, dimnames=list(c('red','blue','green'), c('circle','square','sphere')))
# Create index matrix - each row is a row/col index
i <- cbind(match(d$color, rownames(m)), match(d$shape, colnames(m)))
# Now use it and add as the id column...
d2 <- cbind(id=m[i], d)
d2
# id color shape
#1 1 red circle
#2 5 blue square
#3 2 blue circle
#4 9 green sphere
Функция match
используется для поиска соответствующего числового индекса для конкретной строки.
Обратите внимание, что в более новой версии R (2.13 и новее, я думаю) вы можете использовать символьные строки в индексной матрице.К сожалению, столбцы цвета и формы обычно factors
, и cbind
это не нравится (используются целочисленные коды), поэтому вам необходимо привести их к as.character
:
i <- cbind(as.character(d$color), as.character(d$shape))
... Я подозреваю, что использование match
более эффективно.
РЕДАКТИРОВАТЬ Я измерил, и кажется, что использование match
примерно на 20% быстрее:
# Make 1 million rows
d <- d[sample.int(nrow(d), 1e6, TRUE), ]
system.time({
i <- cbind(match(d$color, rownames(m)), match(d$shape, colnames(m)))
d2 <- cbind(id=m[i], d)
}) # 0.46 secs
system.time({
i <- cbind(as.character(d$color), as.character(d$shape))
d2 <- cbind(id=m[i], d)
}) # 0.55 secs