2014-11-03 40 views
1

讓我們做一個虛擬數據第一乘以兩個不同的dataframes只對完全匹配的行和列名

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 

我想乘「B」是完全的「A」的行名匹配的列(在這裏,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 

,這意味着它也因爲Q和QQ有一個共同的信乘以QQ!我如何獲得以下內容?

[[1]] 
[1] 25 25 35 

[[2]] 
[1] 66 72 84 

回答

2

當你想要一個data.frame的"Q"欄,你可以做b[, "Q"]b[["Q"]]。將返回名稱包含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]) 
相關問題