2016-02-13 114 views
2

a,b和c是列表。列表“a”和“b”具有相同数量的对象和元素。“仅使用列表的第一个元素”R

a<-list(c(3,4,5),c(1,3)) 
b<-list(c(5,8,7),c(6,8)) 
c<-list(10,9) 

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

[[2]] 
[1] 1 3 

> b 
[[1]] 
[1] 5 8 7 

[[2]] 
[1] 6 8 

> c 
[[1]] 
[1] 10 

[[2]] 
[1] 9 

我要计算的总和 “选择(C,A:B)”,在相应的位置。预期的结果是一个列表,它也有两个分别包含3个和2个元素的对象。正如:

[[1]] 
[1] X1 X2 X3 

[[2]] 
[1] Y1 Y2 

例如:X1 =总和(选择(10,3:5)),X2 =总和(选择(10,4:8)),Y1 =总和(选择(9,1 :6))......

我尝试使用下面的代码来计算:

mapply(function(a,b,c) sum(choose(c,a:b)), a,b,c) 

,但我得到的警告:

[1] 582 465 
Warning messages: 
1: In a:b : numerical expression has 3 elements: only the first used 
2: In a:b : numerical expression has 3 elements: only the first used 
3: In a:b : numerical expression has 2 elements: only the first used 
4: In a:b : numerical expression has 2 elements: only the first used 

只有在每个第一要素对象已被使用,可以哟你帮我弄明白了吗?谢谢!

回答

3

我们可以使用一个lapply/mapply组合

lapply(seq_along(a), function(i) 
    mapply(function(x,y,z) sum(choose(z,x:y)), a[[i]], b[[i]], c[[i]])) 
#[[1]] 
#[1] 582 837 582 

#[[2]] 
#[1] 465 465 

或双Map/mapplymapply/mapply

Map(function(x,y,z) mapply(function(x,y,z) 
     sum(choose(z, x:y)) , x,y, z) , a, b, c) 

之所以OP得到了警告信息是基于:。我们得到相应的list元素与Map,但是'a','b'中的每个元素也是一个长度大于1的向量。:只能根据相应的向量元素采用单个序列。为了获得相应向量元素的所有序列,我们需要再次循环。所以使用第二个Map/mapply

+1

谢谢!哦,':'是原因,难怪我可以计算''a + b'',但是不能计算':'。 – lightsnail

相关问题