2013-02-28 9 views

risposta

6

Questo probabilmente non è il modo più veloce per calcolarlo, e utilizza certamente più risorse, ma qui è un prendere completamente diverso su di esso:

> 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

possono essere abbastanza veloci, non sarei sorpreso se questo è molto veloce ... specialmente se hai cambiato la seconda riga in '-diff (colSums (a))' – Gregor

+1

deve essere 'byrow = TRUE', o è la tua lista di cose diversa da OP? – adibender

+0

@adibender 'mylist = lista (c (0,1), c (1,1), c (3,2))' Sì, hai completamente ragione, mi dispiace! – ds440

5

Prova questo

# 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 per leggere con maggiore attenzione di quanto ho fatto per la prima volta in giro! – A5C1D2H2I1M1N2O1R2T1

+0

in alternativa, si potrebbe fare 'diff (Riduci ('+', Elenco))' – Arun

3

Se quel modello , prendendo le differenze di primo meno secondo elemento, è coerente, quindi basta scrivere una funzione anonima in una chiamata a sapply o 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 

Questo può essere ottenuto anche (come @AnandaMahto e @Jilber usati) con la funzione diff. diff(0, 1) dà il 2 ° meno il 1 °, quindi dobbiamo usare -diff per il 1 ° meno 2 °.

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

Grazie a @AnandaMahto per mettere insieme le teste – Gregor

7

Non è un grande fan di Reduce, do.call è solitamente più veloce. In questo caso la soluzione unlist sembra avere un leggero vantaggio:

EDIT: @ ds440 per la vittoria!

            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 

Dove ds è l'approccio @ ds440 avvolto in una funzione.

+3

Penso che oltre alla velocità, la leggibilità è anche un fattore importante da considerare. Di questi, trovo che 'Reduce' è il meno" lettore-friendly ". – A5C1D2H2I1M1N2O1R2T1

+0

+1 per la soluzione 'do.call' e benchmarking. Le matrici –

Problemi correlati