R编程:我需要帮助找到一个有两列的列表的总和

6

我希望你能帮我解决以下问题:

我有一个列表:

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

如何获取总和:

(0-1)+(1-1)+(3-2)
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 所采用的一种方法,包装在一个函数中。


3
除了速度外,易读性也是需要考虑的主要因素之一。在这些因素中,我认为“Reduce”最不“读者友好”。 - A5C1D2H2I1M1N2O1R2T1

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])

1
矩阵可以非常快,如果你将第二行改为“-diff(colSums(a))”,我不会感到惊讶,特别是速度非常快。 - Gregor Thomas
1
必须设置 byrow = TRUE,或者你的 mylist 和 OP 的不同吗? - adibender
@adibender mylist = list(c(0,1), c(1,1), c(3,2)) 是的,你完全正确,抱歉! - ds440

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

1
仔细阅读比我第一次做得更好,加1! - A5C1D2H2I1M1N2O1R2T1
或者,您可以执行 diff(Reduce('+', List)) - Arun

3
如果这个模式,即第一个元素减去第二个元素的差是一致的,那么只需在调用sapplylapply时编写一个匿名函数即可。
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

这也可以通过使用diff函数来实现(就像@AnandaMahto和@Jilber所用的方法)。diff(0, 1)表示第二个减去第一个,因此我们需要使用-diff来进行第一个减去第二个。
sum(-sapply(mylist, FUN = diff))

感谢@AnandaMahto的贡献和集思广益。 - Gregor Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接