计算R中所有组合的乘积

时间:2016-08-22 16:08:54

标签: r list combinations

列表a如下:

a<-list(3:6,6:8,3:4,8)

> a
[[1]]
[1] 3 4 5 6

[[2]]
[1] 6 7 8

[[3]]
[1] 3 4

[[4]]
[1] 8

我的目标是计算每个对象中所有2元素组合的所有产品。例如,a中的第一个对象是3 4 5 6,因此第一个对象的所有产品都是12 15 18 20 24 30,第二个对象的所有产品都是42 48 56。但是当对象中只有一个元素时,输出应为0。我计划使用Map(function(x) combn(x,2,prod),a)来解决问题,但是当对象中只有一个元素时(例如a中的第4个对象),它不适合。

> Map(function(x) combn(x,2,prod),a)
[[1]]
[1] 12 15 18 20 24 30

[[2]]
[1] 42 48 56

[[3]]
[1] 12

[[4]]
 [1]  2  3  4  5  6  7  8  6  8 10 12 14 16 12 15 18 21 24 20 24 28 32 30 35 40 42 48 56

那么如何在每个对象中获得所有组合的所有2元素产品,并在同时只有一个元素时获得0?谢谢!

我的预期结果如下:

[[1]]
[1] 12 15 18 20 24 30

[[2]]
[1] 42 48 56

[[3]]
[1] 12

[[4]]
[1] 0 

2 个答案:

答案 0 :(得分:6)

使用您的方法并打包combn

a<-list(3:6,6:8,3:4,8)
combn2 <- function(x, ...) 
  if(length(x) == 1L) 0 else combn(x, ...)
Map(function(x) combn2(x,2,prod),a)
#[[1]]
#[1] 12 15 18 20 24 30
#
#[[2]]
#[1] 42 48 56
#
#[[3]]
#[1] 12
#
#[[4]]
#[1] 0

答案 1 :(得分:3)

我们可以尝试使用if/else条件

Map(function(x) if(length(x)==1) 0 else combn(x,2, FUN = prod),a)
#[[1]]
#[1] 12 15 18 20 24 30

#[[2]]
#[1] 42 48 56

#[[3]]
#[1] 12

#[[4]]
#[1] 0

我认为@Roland首先回答它(在我之前9秒,虽然我没有看到他的答案),所以上面的变化是

ifelse(lengths(a)==1, 0, Map(function(x) combn(x, 2, prod), a))

lapply

ifelse(lengths(a)==1, 0, lapply(a, function(x) combn(x, 2, FUN = prod)))