Ich brauche Ihnen dabei helfen:R Programmierung ich brauche Summe einer Liste Hilfe bei der Suche mit 2 Spalten
Ich habe eine Liste:
list(c(0,1), c(1,1), c(3,2))
wie kann ich die Summe erhalten:
(0-1)+(1-1)+(3-2)
Ich brauche Ihnen dabei helfen:R Programmierung ich brauche Summe einer Liste Hilfe bei der Suche mit 2 Spalten
Ich habe eine Liste:
list(c(0,1), c(1,1), c(3,2))
wie kann ich die Summe erhalten:
(0-1)+(1-1)+(3-2)
Dies ist wahrscheinlich nicht der schnellste Weg, um es zu berechnen, und es nutzt sicherlich mehr Ressourcen, aber hier ist eine ganz andere Perspektive auf sie:
> mylist = list(c(0,1), c(1,1), c(3,2))
> a = matrix(unlist(mylist), ncol=2, byrow=T)
> sum(a[,1]-a[,2])
Versuchen Sie, diese
# 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 für das Lesen sorgfältiger als ich das erste Mal tat um! – A5C1D2H2I1M1N2O1R2T1
alternativ könnten Sie 'diff (Reduce ('+', List))' – Arun
Wenn das Muster , die Unterschiede von ersten minus zweiten Element, ist konsistent, dann schreiben Sie einfach eine anonyme Funktion in einem Anruf an sapply
oder lapply
. Diese
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
kann auch erreicht werden (wie @AnandaMahto und @Jilber verwendet wird) mit der Funktion diff
. gibt die 2. minus die 1., so müssen wir -diff
für 1. minus 2. verwenden.
sum(-sapply(mylist, FUN = diff))
Dank @AnandaMahto für die Köpfe zusammen setzen – Gregor
kein großer Fan von Reduce
ist do.call
in der Regel schneller. In diesem Fall wird die unlist
Lösung scheint einen leichten Vorsprung zu haben:
EDIT: @ ds440 für den Gewinn!
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
Wo ds
ist der Ansatz von @ ds440 in einer Funktion gewickelt.
Ich denke, dass neben der Geschwindigkeit, Lesbarkeit ist auch ein wichtiger Faktor zu berücksichtigen. Von diesen finde ich 'Reduce' am wenigsten" leserfreundlich ". – A5C1D2H2I1M1N2O1R2T1
+1 für 'do.call' Lösung und Benchmarking. –
Matrizen können ziemlich schnell sein, ich wäre nicht überrascht, wenn das sehr schnell ist ... vor allem, wenn Sie die zweite Zeile in '-diff geändert haben (colSums (a))' – Gregor
muss 'byrow = TRUE' sein, oder ist deine mylist anders als OPs? – adibender
@adibender 'mylist = Liste (c (0,1), c (1,1), c (3,2))' Ja, du hast vollkommen recht, sorry! – ds440