我一直想知道:在R中,为了允许对项目列表进行应用式处理,推荐使用顺序相关函数反转函数参数的方法是什么?
举一个简单的例子,假设我有一个数字列表和一个除数。
numerator = list(5, 10, 15, 250)
denominator = 2
我想用除数除以每个数字。我知道在这种情况下我可以轻松使用数字向量:
as.numeric(numerator)/denominator
# [1] 2.5 5.0 7.5 125.0
但在现实世界中,列表可能包含更复杂的数据结构,使得矢量投射不可能。这只是一个简单的例子。相反,我们可以像这样使用lapply(或sapply)来产生相同的答案:
sapply(numerator, "/", denominator)
# [1] 2.5 5.0 7.5 125.0
所以这里有一个问题:如果你想将参数翻转到函数,你会怎么做?如同,将每个数字除以“分母”,而不是相反?通常以“/”表示分子,然后是分母。但是现在我想用分子划分分母,“/”函数不能再与sapply一起使用(这要求列表项是函数的第一个参数)。
我想要这个结果:
denominator/as.numeric(numerator)
# [1] 0.4000000 0.2000000 0.1333333 0.0080000
我通常这样做的方法是编写一个反转参数的新函数:
inverse_divide = function(denominator, numerator) {
return(numerator/denominator)
}
现在,它有效:
sapply(numerator, inverse_divide, denominator)
# [1] 0.4000000 0.2000000 0.1333333 0.0080000
但这变老了。有更简单的方法吗?
答案 0 :(得分:3)
您可以使用mapply
。它可以从vector
和list
中获取相应的元素并除以/
。在这种情况下,“分母”只有一个元素,因此它将被回收。如果元素的长度在“分子”和“分子”中都相同和&分母',如上所述使用相应的元素。
mapply(`/`, denominator, numerator)
#[1] 0.4000000 0.2000000 0.1333333 0.0080000
mapply(`/`, numerator, denominator)
#[1] 2.5 5.0 7.5 125.0
答案 1 :(得分:3)
另一种方式是
sapply(numerator, function(x) denominator / x)
## [1] 0.4000000 0.2000000 0.1333333 0.0080000