每个向量元素的调用函数

时间:2017-07-16 13:34:53

标签: r elements data-conversion

我写了一个简单的函数来计算以dBm为单位的平均测量功率。首先,我必须编写将dBm转换为瓦特的函数,找到平均值并将值转换回dBm。 这适用于单个矢量

例如:

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中的每对元素调用我的书面函数(这些元素具有相同的大小)。

最简单的是forc for for循环

keepResults<-vector()
for i in seq(1,length(vector1)){
    keepResults<-MeanDb(vector1[i],vector2[i])
}

但我很确定在R中应该有更有效的替代方案。你能在R中提供能够以更短的方式做到这一点的命令吗? 问候和感谢 亚历

3 个答案:

答案 0 :(得分:2)

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

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)

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

答案 1 :(得分:1)

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

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)

希望这有帮助!

答案 2 :(得分:0)

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

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)