让我们先制作一个虚拟数据
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
答案 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])