2016-12-05 85 views
0

我希望有人能夠幫助我理解爲什麼mapply函數在調用sum函數時以及在調用mean函數時的行爲有所不同。爲什麼mapply()的行爲有所不同,取決於所謂的函數?

我的問題是可能會更好通過查看此MWE(從https://nsaunders.wordpress.com/2010/08/20/a-brief-introduction-to-apply-in-r/部分地借用)

l1 <- list(a = c(1:10), b = c(11:20)) 
l2 <- list(c = c(21:30), d = c(31:40)) 

mapply(sum, l1$a, l1$b, l2$c, l2$d) 

[1] 64 68 72 76 80 84 88 92 96 100 

上面的代碼返回10倍的值,在各相應的元件的總和對象解釋的a,b,c和d。

下面的例子不以相同的方式工作:

mapply(mean, l1$a, l1$b, l2$c, l2$d) 

[1] 1 2 3 4 5 6 7 8 9 10 

在好像b,c和d中的後者的例子將被忽略和它只是計算的每個元素的平均值。

如果有人能幫助我理解這將是偉大的。

非常感謝!

+1

這與'mapply'無關。見'sum'和'mean':他們在處理他們的論點時有不同的機制。你認爲'sum(1,2,3)'會返回什麼?那麼'意味着什麼(1,2,3)'? – nicola

+0

謝謝尼科拉,現在這個便士終於落下了。 –

回答

3

mapply按預期工作。它從元素列表中總結或者說明元素。例如:

l1$a[1] + l1$b[1] + l2$c[1] + l2$d[1] 

[1] 64 

mean(l1$a[1], l1$b[1], l2$c[1], l2$d[1]) 

[1] 1 

注意mean只使用第一個參數,因爲它只接受x(見?mean)。

> mean(l1$a[1]) 
[1] 1 
> mean(l1$a[1], l1$b[1]) 
[1] 1 

您可能想要使用rapply

l <- list(l1, l2) 
rapply(l, mean) 

    a b c d 
5.5 15.5 25.5 35.5 
+0

謝謝你的回覆。所以我正確地說,'mapply'沒有按我的預期工作的原因是因爲'mean'函數只允許一個數字參數,而'sum'或'range'函數會使用多個單一數字參數呢? –

+1

@Frost_Maggot。定義是'mean(x,...)',其中'...'是從其他方法傳遞的參數,而sum(...,na.rm = FALSE)'其中'...是向量。 –

+0

謝謝你的幫助:) –

相關問題