我已经用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中的每一对元素调用我编写的函数(这两个元素的大小相同)。
最简单的方法是ofc a for循环。
keepResults<-vector()
for i in seq(1,length(vector1)){
keepResults<-MeanDb(vector1[i],vector2[i])
}但我相当肯定,在R中应该有更有效的替代方案。您是否可以在R中提供可以以更短的方式完成此任务的命令?致以问候和感谢,亚历克斯
发布于 2017-07-16 22:37:18
不需要*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)这可以推广到任意数量的向量。
发布于 2017-07-16 21:42:30
对于两个列表,您可以将您的函数重写为:
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)希望这能有所帮助!
发布于 2017-07-16 22:06:43
您还可以使用purrr包中的pmap (一般情况)或map2 (在本例中)。如果我使用上面由@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)https://stackoverflow.com/questions/45129189
复制相似问题