Вызов функции на элемент вектора
Я написал простую функцию для расчета средней мощности измерений в дБм. Сначала мне нужно было написать функцию для преобразования дБм в ватт, найти среднее значение и преобразовать значение обратно в дБм. Это прекрасно работает для одного вектора
Например:
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 (они имеют одинаковый размер).
Самым простым будет цикл
keepResults<-vector()
for i in seq(1,length(vector1)){
keepResults<-MeanDb(vector1[i],vector2[i])
}
но я вполне уверен, что в R должны быть более эффективные альтернативы. Можете ли вы предоставить команды в R, которые могут сделать это более коротким способом? С уважением и благодарностью Алекс
3 ответа
Там нет необходимости *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)
Это обобщает на произвольное число векторов.
Всего для двух списков вы можете переписать свою функцию следующим образом:
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)
Надеюсь это поможет!
Вы также можете использовать 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)