我写了一个简单的函数来计算以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中提供能够以更短的方式做到这一点的命令吗? 问候和感谢 亚历
答案 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)