列表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
答案 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)))