Muszę Ci w tym pomóc:programowania R i potrzebujesz pomocy w znalezieniu sumę liście z 2 kolumny
Mam listę:
list(c(0,1), c(1,1), c(3,2))
Jak mogę uzyskać sumę:
(0-1)+(1-1)+(3-2)
Muszę Ci w tym pomóc:programowania R i potrzebujesz pomocy w znalezieniu sumę liście z 2 kolumny
Mam listę:
list(c(0,1), c(1,1), c(3,2))
Jak mogę uzyskać sumę:
(0-1)+(1-1)+(3-2)
To prawdopodobnie nie jest to najszybszy sposób, żeby to obliczyć, a to z pewnością wykorzystuje więcej zasobów, ale tutaj jest zupełnie inne podejście do niego:
> mylist = list(c(0,1), c(1,1), c(3,2))
> a = matrix(unlist(mylist), ncol=2, byrow=T)
> sum(a[,1]-a[,2])
Spróbuj
# 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 do czytania bardziej ostrożnie niż ja po raz pierwszy na około! – A5C1D2H2I1M1N2O1R2T1
alternatywnie, możesz zrobić 'diff (Reduce ('+', List))' – Arun
jeśli to wzór , biorąc różnice pierwszego i drugiego elementu, jest spójny, po prostu napisz anonimową funkcję w wywołaniu sapply
lub 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
ten może być osiągnięty (używane @AnandaMahto i @Jilber) działający diff
. diff(0, 1)
daje drugi minus 1, więc musimy użyć -diff
dla pierwszego odjąć 2nd.
sum(-sapply(mylist, FUN = diff))
Dzięki @AnandaMahto do umieszczenia głów razem – Gregor
Nie wielkim fanem Reduce
, do.call
jest zazwyczaj szybsza. W tym przypadku rozwiązanie unlist
wydaje się mieć lekką przewagę:
EDIT: @ ds440 o zwycięstwo!
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
przypadku ds
jest podejście @ ds440 owinięty w funkcji.
Myślę, że oprócz szybkości, czytelność jest również ważnym czynnikiem do rozważenia. Spośród nich uważam, że "Redukuj", aby było najmniej przyjazne dla czytelnika. – A5C1D2H2I1M1N2O1R2T1
+1 dla rozwiązania 'do.call' i testów porównawczych. –
matryce mogą być dość szybkie, nie zdziwiłbym się, gdyby to było bardzo szybkie ... szczególnie jeśli zmieniłeś drugi wiersz na '-diff (colSums (a))' – Gregor
musi być 'byrow = TRUE', lub jest twoja lista różni się od OP? – adibender
@adibender 'mylist = list (c (0,1), c (1,1), c (3,2))' Tak, masz całkowitą rację, przepraszam! – ds440