我在R里有这个名单
> test
[[1]]
[[1]]$right
[1] FALSE
[[1]]$left
[1] FALSE
[[2]]
[[2]]$right
[1] TRUE
[[2]]$left
[1] FALSE
其可以利用该DPUT快速创建
list(list(right = FALSE, left = FALSE), list(right = TRUE, left = FALSE))
现在我想把right
和test
-list的每个元素中的left
元素相加,这样我就得到了一个包含两个元素的列表,如下所示:
> res
$right
[1] 1
$left
[1] 0
我认为R的Reduce
是一个很好的选择(尽管我愿意接受任何建议),但我无法弄清楚代码。我尝试了以下代码,但它不起作用...
Reduce(function(x){
r = sum(x[["right"]])
l = sum(x[["left"]])
v = list(r, v)
}, test)
我得到这个错误
Error in f(init, x[[i]]) : unused argument (x[[i]])
我想我脑子里有些误解...
6条答案
按热度按时间tf7tbtn21#
您可以
unlist
列表并强制rowSums
as.list
,这可能更有效。rn0zuynd2#
Reduce需要一个接受两个参数的函数,它将得到
Reduce
的前一个值的结果和传递给Reduce
的向量中的一个新元素就我个人而言,我会使用
sapply
(或者Map
,如果您愿意的话)首先获取left
/right
元素,然后将它们传递给sum
:包含
Map
和Reduce
的版本为:或
c0vxltue3#
使用
purrr
ki1q1bka4#
由于需要按名称进行聚合,因此可以使用
unlist
和tapply
按名称求和:您可以先转置:
o75abkj45#
除了它们分别生成一个命名向量、一个xtabs/table对象或一个data.frame之外,它们都是相同的。在所有这些方法中,我们都取消列出输入,并将其堆叠到一个两列的 Dataframe 中。然后我们使用
xtabs() |> c()
、xtabs()
或aggregate
。注解
rfbsl7qr6#
我将使用这种方法来计算列表的右和左