ho bisogno di aiutare con questo:R programmazione ho bisogno di aiuto per trovare somma di una lista con 2 colonne
Ho una lista:
list(c(0,1), c(1,1), c(3,2))
come posso ottenere la somma:
(0-1)+(1-1)+(3-2)
ho bisogno di aiutare con questo:R programmazione ho bisogno di aiuto per trovare somma di una lista con 2 colonne
Ho una lista:
list(c(0,1), c(1,1), c(3,2))
come posso ottenere la somma:
(0-1)+(1-1)+(3-2)
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])
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 per leggere con maggiore attenzione di quanto ho fatto per la prima volta in giro! – A5C1D2H2I1M1N2O1R2T1
in alternativa, si potrebbe fare 'diff (Riduci ('+', Elenco))' – Arun
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))
Grazie a @AnandaMahto per mettere insieme le teste – Gregor
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.
Penso che oltre alla velocità, la leggibilità è anche un fattore importante da considerare. Di questi, trovo che 'Reduce' è il meno" lettore-friendly ". – A5C1D2H2I1M1N2O1R2T1
+1 per la soluzione 'do.call' e benchmarking. Le matrici –
possono essere abbastanza veloci, non sarei sorpreso se questo è molto veloce ... specialmente se hai cambiato la seconda riga in '-diff (colSums (a))' – Gregor
deve essere 'byrow = TRUE', o è la tua lista di cose diversa da OP? – adibender
@adibender 'mylist = lista (c (0,1), c (1,1), c (3,2))' Sì, hai completamente ragione, mi dispiace! – ds440