2012-07-27 30 views
0

我有这样查找值基于在数据帧中的字符串

X  Y VALUE  
"AAA" "BBB" 
"CCC" "AAA" 

一个数据帧I还具有矩阵为:

 AAA BBB CCC 
AAA 1 13 2 
BBB 27 11 4 
CCC 6 12 3 

与AAA,BBB和CCC作为列名称和行名称。我如何使用矩阵中的值填充数据框中的VALUE列?

回答

2

你可以做

df$VALUE <- mat[cbind(df$X, df$Y)] 

使用你的例子:

df <- data.frame(X = c("AAA", "CCC"), 
       Y = c("BBB", "AAA"), stringsAsFactors = FALSE) 
df 
#  X Y 
# 1 AAA BBB 
# 2 CCC AAA 

mat <- matrix(c(1, 27, 6, 13, 11, 12, 2, 4, 3), 
       nrow = 3, ncol = 3, 
       dim = list(c("AAA", "BBB", "CCC"), 
         c("AAA", "BBB", "CCC"))) 
mat 
#  AAA BBB CCC 
# AAA 1 13 2 
# BBB 27 11 4 
# CCC 6 12 3 

df$VALUE <- mat[cbind(df$X, df$Y)] 
df 
#  X Y VALUE 
# 1 AAA BBB 13 
# 2 CCC AAA  6 
+0

你好。谢谢您的回答。出于某种原因,字符串存储为矩阵中的rownames和colnames,直接使用“cbind”对我的矩阵不起作用。我必须使用像mat [cbind(match(m3 $ X,rownames(mat)),match(m3 $ Y,colnames(mat)))]来使它工作。 – Seen 2012-07-27 04:08:30

+1

通过“不工作”,你的意思是它不会返回期望的值(但没有错误)?如果是这样,问题可能来自您的X和Y列是因素,您可以通过运行'class(m3 $ X)'来检查。 – flodel 2012-07-27 04:38:11

+0

......在这种情况下,您可以运行一些类似'mat [cbind(as.character(m3 $ X),as.character(m3 $ Y))]''的东西,或考虑从数据中移除因素。 。 – flodel 2012-07-27 04:43:21

0

您也可以直接从矩阵熔体得到数据框:

library(reshape2) 
melt(mat) 
+0

这将是另一个问题的答案。您没有使用OP的两个输入中的一个。 – flodel 2012-07-27 11:23:55