2013-02-28 53 views

回答

6

這可能是沒有計算它的最快方式,它當然使用更多的資源,但在這裏是一個完全不同對其採取:更仔細地比我做了第一次

> mylist = list(c(0,1), c(1,1), c(3,2)) 

> a = matrix(unlist(mylist), ncol=2, byrow=T) 
> sum(a[,1]-a[,2]) 
+1

矩陣可以很快,如果這非常快速,我不會感到驚訝......特別是如果您將第二行更改爲'-diff(colSums(a))' – Gregor 2013-02-28 22:47:20

+1

必須是'byrow = TRUE',或者是你的mylist與OPs不同? – adibender 2013-02-28 23:11:52

+0

@adibender'mylist = list(c(0,1),c(1,1),c(3,2))'是的,你完全正確,對不起! – ds440 2013-02-28 23:38:29

5

試試這個

# Sum of the first differences of your list 
> (Sumlist <- lapply(List, function(x) -sum(diff(x)))) 
[[1]] 
[1] -1 # this is (0-1) 

[[2]] 
[1] 0 # this is (1-1) 

[[3]] 
[1] 1 # this is (3-2) 

# Total sum of your list 
> Reduce('+', Sumlist) # this is (0-1)+(1-1)+(3-2) 
[1] 0 
+1

+1閱讀周圍! – A5C1D2H2I1M1N2O1R2T1 2013-02-28 20:00:52

+0

或者,你可以做'diff(Reduce('+',List))' – Arun 2013-03-18 18:16:52

3

如果該模式,第一個減去第二個元素的差異是一致的,那麼只需在致電sapplylapply時寫一個匿名函數。

mylist <- list(c(0,1), c(1,1), c(3,2)) 
sapply(mylist, FUN = function(x) {x[1] - x[2]}) ## takes differences 
sum(sapply(mylist, FUN = function(x) {x[1] - x[2]})) ## put it all together 

這也可以實現(如@AnandaMahto和@Jilber使用)與diff功能。 diff(0, 1)給出第二個減去第一個,所以我們需要使用-diff第一個減去第二個。

sum(-sapply(mylist, FUN = diff)) 
+0

感謝@AnandaMahto將頭像放在一起 – Gregor 2013-02-28 20:21:48

7

不是很大的粉絲Reducedo.call通常更快。在這種情況下,unlist解決方案似乎有輕微的優勢:

編輯: @ ds440爲贏!

            expr min  lq median  uq  max 
1  do.call(sum, lapply(List, function(z) -diff(z))) 63.132 67.7520 70.061 72.7560 291.406 
2            ds(List) 6.930 10.5875 11.935 12.7040 51.584 
3 Reduce("+", lapply(List, function(x) -sum(diff(x)))) 78.530 81.6100 83.727 87.1915 855.355 
4        sum(-sapply(List, diff)) 88.155 91.4260 94.121 97.2005 955.442 
5      sum(-unlist(lapply(List, diff))) 57.358 60.4375 61.785 63.5170 145.126 

ds是@ ds440包裹在一個函數的方法。

+3

我認爲除了速度之外,易讀性也是一個需要考慮的主要因素。其中,我認爲「減少」至少是「讀者友好」。 – A5C1D2H2I1M1N2O1R2T1 2013-02-28 20:47:43

+0

用於'do.call'解決方案和基準測試。 – 2013-03-04 09:09:36