将两个不同的数据帧相乘只是为了完全匹配行名和列名

时间:2014-11-03 01:33:59

标签: r loops match

让我们先制作一个虚拟数据

a=data.frame(average=c(5,6), row.names=c("Q", "R"))
> a
  average
Q       5
R       6

b=data.frame(c(5,5,7), c(8,9,10), c(11,12,14))
> colnames(b)<-c("Q","QQ","R")
> b
  Q QQ  R
1 5  8 11
2 5  9 12
3 7 10 14

我希望将&#39; b&#39;的列加倍。与&#39; a&#39;的行名称完全匹配(这里,Q和R完全匹配)。但是当我做一个简单的循环时,它会给出

n = row.names(a)
> lapply(1:length(n), function(i)
+ a[grep(n[i], row.names(a)),]*b[,grep(n[i], colnames(b))])
[[1]]
   Q QQ
1 25 40
2 25 45
3 35 50

[[2]]
[1] 66 72 84

这意味着它也会增加QQ,因为Q和QQ有一个共同的字母!我怎样才能得到以下内容?

[[1]]
[1] 25 25 35

[[2]]
[1] 66 72 84

1 个答案:

答案 0 :(得分:2)

当您需要data.frame的列"Q"时,您可以b[, "Q"]b[["Q"]]。而b[, grep("Q", colnames(b))]执行操作将返回名称中包含Q的所有列。考虑到这一点,您的代码应该是:

n <- rownames(a)
lapply(1:length(n), function(i) a[n[i], ] * b[, n[i]])

lapply(rownames(a), function(i) a[i, ] * b[, i])

可能会采取更优雅的方法:

i <- intersect(rownames(a), colnames(b))
Map(`*`, a[i, ], b[, i])