6

これについてあなたの助けが必要です:

リストがあります:

list(c(0,1), c(1,1), c(3,2))

どうすれば合計を取得できますか:

(0-1)+(1-1)+(3-2)
4

4 に答える 4

7

の大ファンではなく、Reduce通常do.callは高速です。この場合、unlistソリューションにはわずかな優位性があるようです。

編集:勝利のための@ ds440!

                                                  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

ds関数にラップされた@ ds440によるアプローチはどこにありますか。

于 2013-02-28T20:20:14.727 に答える
6

これはおそらく最速の計算方法ではなく、確かにより多くのリソースを使用しますが、ここではまったく別の見方をしています。

> mylist = list(c(0,1), c(1,1), c(3,2))

> a = matrix(unlist(mylist), ncol=2, byrow=T)
> sum(a[,1]-a[,2])
于 2013-02-28T22:25:24.703 に答える
5

これを試して

# 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
于 2013-02-28T19:55:22.923 に答える
3

sapply最初から 2 番目の要素を差し引いた差を取るそのパターンが一貫している場合は、 orの呼び出しに無名関数を記述します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

これは、関数を使用して (@AnandaMahto および @Jilber を使用して) 達成することもできdiffます。diff(0, 1)は 2 番目から 1 番目を引くので、1 番目から 2 番目を引くために使用する必要があります-diff

sum(-sapply(mylist, FUN = diff))
于 2013-02-28T20:01:51.233 に答える