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
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
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)))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With