我有这样查找值基于在数据帧中的字符串
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列?
我有这样查找值基于在数据帧中的字符串
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列?
你可以做
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
您也可以直接从矩阵熔体得到数据框:
library(reshape2)
melt(mat)
这将是另一个问题的答案。您没有使用OP的两个输入中的一个。 – flodel 2012-07-27 11:23:55
你好。谢谢您的回答。出于某种原因,字符串存储为矩阵中的rownames和colnames,直接使用“cbind”对我的矩阵不起作用。我必须使用像mat [cbind(match(m3 $ X,rownames(mat)),match(m3 $ Y,colnames(mat)))]来使它工作。 – Seen 2012-07-27 04:08:30
通过“不工作”,你的意思是它不会返回期望的值(但没有错误)?如果是这样,问题可能来自您的X和Y列是因素,您可以通过运行'class(m3 $ X)'来检查。 – flodel 2012-07-27 04:38:11
......在这种情况下,您可以运行一些类似'mat [cbind(as.character(m3 $ X),as.character(m3 $ Y))]''的东西,或考虑从数据中移除因素。 。 – flodel 2012-07-27 04:43:21