2013-02-28 17 views

Trả lời

6

Điều này có lẽ không phải là cách nhanh nhất để tính toán nó, và nó chắc chắn sử dụng nhiều nguồn lực hơn, nhưng đây là một mất hoàn toàn khác nhau về nó:

> 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

ma trận có thể được khá nhanh, tôi sẽ không ngạc nhiên nếu điều này là rất nhanh chóng ... đặc biệt là nếu bạn thay đổi dòng thứ hai để '-diff (colSums (a))' – Gregor

+1

phải là 'byrow = TRUE', hoặc là danh sách của bạn khác với OP? – adibender

+0

@adibender 'mylist = list (c (0,1), c (1,1), c (3,2))' Có, bạn hoàn toàn đúng, xin lỗi! – ds440

5

Hãy thử điều này

# 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 để đọc cẩn thận hơn tôi đã lần đầu tiên xung quanh! – A5C1D2H2I1M1N2O1R2T1

+0

cách khác, bạn có thể làm 'diff (Giảm ('+', Danh sách))' – Arun

3

Nếu mẫu đó , lấy sự khác biệt của phần tử thứ nhất trừ thứ hai, nhất quán, sau đó chỉ cần viết một hàm ẩn danh trong một cuộc gọi đến sapply hoặc lapply.

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 

này cũng có thể đạt được (như @AnandaMahto và @Jilber sử dụng) với diff chức năng. diff(0, 1) cho số 2 trừ đi số 1, vì vậy chúng tôi cần sử dụng -diff cho số 1 trừ đi thứ 2.

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

Nhờ @AnandaMahto để đặt đầu với nhau – Gregor

7

Không phải là người hâm mộ lớn của Reduce, do.call thường nhanh hơn. Trong trường hợp này các giải pháp unlist dường như có một lợi thế cạnh nhẹ:

EDIT: @ ds440 để giành chiến thắng!

            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 

Trường hợp ds là cách tiếp cận của @ ds440 được bao bọc trong một hàm.

+3

Tôi nghĩ rằng ngoài tốc độ, tính dễ đọc cũng là yếu tố chính cần xem xét. Trong số này, tôi tìm thấy 'Reduce' to be least" reader thân thiện ". – A5C1D2H2I1M1N2O1R2T1

+0

+1 cho giải pháp 's.call' và điểm chuẩn. –

Các vấn đề liên quan