2012-05-30 51 views
2

鑑於與重量以下矩陣中的第一列LS和heihts在第二式柱的行:簡明應用到(MX 2)矩陣

> wgt.hgt.matrix 
    [,1] [,2] 
[1,] 180 70 
[2,] 156 67 
[3,] 128 64 
[4,] 118 66 
[5,] 202 72 

我尋找一個簡明的方式來應用此二進制函數像

function(lb, inch) { (lb/inch**2)*703 } -> bmi 

到矩陣的每一行,從而導致陣列,列表或與5個得到的BMI值向量。我找到了一種方法使用apply功能:

apply(wgt.hgt.matrix, 1, function(row) bmi(row[1], row[2])) 

但圖示操作符如紅寶石(*),將有助於使通話更加簡潔明瞭:

apply(wgt.hgt.matrix, 1, function(row) bmi(*row)) 

是否等同於圖示操作存在,即語法元素告訴R分裂所有向量類對象來填充參數列表? apply電話有其他更簡單或更簡潔的建議嗎?

回答

0

使用bmi()函數作爲矢量化解決方案比較好,因爲它具有所有向量化的運算符,正如Joshua的答案中所示。您還可以這樣做:

colnames(wgt.hgt.matrix) <- c("lb", "inch") 
with(as.data.frame(wgt.hgt.matrix), bmi(lb,inch)) 
# [1] 25.82449 24.43039 21.96875 19.04362 27.39313 

不幸的是矩陣是不是「與」這樣強迫到上面需要一個數據幀構建使用環境很好的基板。您可以得到apply解決方案(這將是時間效率不到量化的方法)與一個版本的BMI()重新雷農一道,以向量與命名的元素(如上面創建):

bmi <- function(vec) { (vec['lb']/vec['inch']**2)*703 } 
apply(wgt.hgt.matrix, 1, function(row) bmi(row)) 
# [1] 25.82449 24.43039 21.96875 19.04362 27.39313 
+0

這並沒有具體回答我關於R中是否存在'splat'的問題,但似乎使用接受向量的函數似乎確實是R中最接近可能的事情。 – neradis

+0

我不知道splat等價函數。有一些名稱爲'的函數。'在'bquote''或'plyr :: ddply'這樣的特定環境下運行,以適合該功能的方式評估或擴展其參數。你可能會構建類似的東西。 –

1

也許我失去了一些東西,但是這有什麼錯:

wgt.hgt.matrix <- 
    structure(c(180L,156L,128L,118L,202L,70L,67L,64L,66L,72L), .Dim=c(5L,2L)) 
bmi <- function(lb, inch) (lb/inch**2)*703 
bmi(wgt.hgt.matrix[,1], wgt.hgt.matrix[,2]) 

更新:

基礎上OP的評論,好像do.call會工作更加普遍:

# put each matrix column in a separate list element 
lc <- lapply(1:ncol(wgt.hgt.matrix), function(i) wgt.hgt.matrix[,i]) 
# call 'bmi' with one argument for each column/list element 
do.call(bmi, lc) 
+0

在我提出的具體問題中,這種解決方案很好。但是,如果我想將8元函數應用於8列矩陣,那麼我會重複8次相同的矩陣名稱。因此,我的問題指的是最接近'splat-operator'的。 – neradis

+0

@neradis:我不知道'splat-operator'是什麼(我不會去查找它來幫助你),所以如果你的問題提到你需要使用這個功能有8個參數。看到我的編輯解決方案。 –

0

我們可以得到相當接近你與do.call尋找語法:

## Setup 
wgt.hgt.matrix=matrix(c(180,70,156,67,128,64,118,66,202,72),ncol=2,byrow=TRUE) 
bmi = function(lb, inch) { (lb/inch**2)*703 } 
## The action 
apply(wgt.hgt.matrix, 1, function(row) do.call(bmi,as.list(row))) 

do.call()實際上不僅僅是一個圖示操作更靈活,你可以使用列表名稱給出參數名稱。