lightsnail
lightsnail

Reputation: 788

Calculate the products of all the combinations in R

List a is as follows:

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

My aim is to calculate all the products of all the 2-element combinations in each object. For example, the first object in a is 3 4 5 6, so all the products of the first object is 12 15 18 20 24 30, and all the products of the second object is 42 48 56. BUT when there is only one element in the object, the output should be 0. I planed to solve the problem by using Map(function(x) combn(x,2,prod),a), but it was not suitable when there was only one element in the object (such as the 4th object in a).

> 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

So how can I get all the 2-element products of all the combinations in each object and get 0 when there is only one element at the same time? Thanks!

My expected result is as follows:

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

[[2]]
[1] 42 48 56

[[3]]
[1] 12

[[4]]
[1] 0 

Upvotes: 6

Views: 276

Answers (2)

akrun
akrun

Reputation: 887118

We can try with an if/else condition

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

I think @Roland answered it first (9 secs before me, though I didn't see his answer), so a variation of the above is

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

Or with lapply

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

Upvotes: 3

Roland
Roland

Reputation: 132706

Use your approach and wrap 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

Upvotes: 6

Related Questions