一個相當簡單的方法是用一個矩陣來索引你的矩陣:
# 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
但效率更高。
EDIT我測量並且它似乎是快大約20%使用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
謝謝大家的幫助。 @Tommy的回答如下,而迪文的答案對此很有幫助。因爲我在我的真實數據中使用了字符向量,所以我和迪文一起去了我的場景。 – Ina 2012-03-22 14:26:54