首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按向量元素调用函数

按向量元素调用函数
EN

Stack Overflow用户
提问于 2017-07-16 21:34:53
回答 3查看 200关注 0票数 1

我已经用dBm编写了一个简单的函数来计算测量的平均功率。首先,我必须编写函数将dBm转换为瓦特,找出平均值,然后将值转换回dBm。这对于单个向量非常有效

例如:

代码语言:javascript
复制
MeanDB <- function(dBVector) {
    # Returns the variance for all the input data. First converts data to linear scale. Then mean() is applied. 
    # Then Data are converted back to log scale
    return(10*log10(mean(10^(dBVector/10))))
}

现在我想对两个向量的元素应用相同的函数,例如vector1和vector2。

我想为向量1和向量2中的每一对元素调用我编写的函数(这两个元素的大小相同)。

最简单的方法是ofc a for循环。

代码语言:javascript
复制
keepResults<-vector()
for i in seq(1,length(vector1)){
    keepResults<-MeanDb(vector1[i],vector2[i])
}

但我相当肯定,在R中应该有更有效的替代方案。您是否可以在R中提供可以以更短的方式完成此任务的命令?致以问候和感谢,亚历克斯

EN

回答 3

Stack Overflow用户

发布于 2017-07-16 22:37:18

不需要*apply循环。只需编写一个矢量化函数:

代码语言:javascript
复制
MeanDB <- function(...) {
  stopifnot(length(unique(lengths(list(...)))) == 1L)
  M <- cbind(...)
  return(10 * log10(rowMeans(10 ^ (M / 10))))
}

a = c(1, 2, 3)
b = c(2, 3, 4)
MeanDB(a, b)

这可以推广到任意数量的向量。

票数 2
EN

Stack Overflow用户

发布于 2017-07-16 21:42:30

对于两个列表,您可以将您的函数重写为:

代码语言:javascript
复制
MeanDB <- function(number1,number2) {
  return(10*log10(mean(10^(c(number1,number2)/10))))
}

# Example of implementation:
a = list(1,2,3)
b = list(2,3,4)
mapply(MeanDB,a,b)

希望这能有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2017-07-16 22:06:43

您还可以使用purrr包中的pmap (一般情况)或map2 (在本例中)。如果我使用上面由@F.Maas定义的函数,

代码语言:javascript
复制
MeanDB <- function(number1,number2) {
return(10*log10(mean(10^(c(number1,number2)/10))))
}
pmap_dbl(list(list(1,2,3),list(4,5,6)),MeanDB)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45129189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档