Raczej prostą alternatywą jest zastosowanie matrycy do indeksu do swojej matrycy:
# 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
The Funkcja match
służy do znalezienia odpowiedniego indeksu numerycznego dla określonego ciągu znaków.
Zauważ, że w nowszej wersji R (2.13 i nowszej, myślę), możesz użyć ciągów znaków w macierzy indeksu. Niestety, kolumny kolor i kształt są zwykle factors
i cbind
nie podoba (używa kodów Integer), więc trzeba zmusić je as.character
:
i <- cbind(as.character(d$color), as.character(d$shape))
... Podejrzewam, że za pomocą match
jest jednak bardziej wydajny.
EDIT, że mierzy się i wydaje się, że około 20% krótszy w użyciu match
:
# 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
Dziękuję wszystkim za pomoc. Obie odpowiedzi @Tommy poniżej, a poniżej odpowiedzi DWin działają świetnie. Poszedłem z DWinem na mój scenariusz, ponieważ miałem wektory postaci w moich prawdziwych danych. – Ina