Вызов функции на элемент вектора

Я написал простую функцию для расчета средней мощности измерений в дБм. Сначала мне нужно было написать функцию для преобразования дБм в ватт, найти среднее значение и преобразовать значение обратно в дБм. Это прекрасно работает для одного вектора

Например:

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)
Другие вопросы по тегам