R- Применение функции с несколькими входами ко всем строкам данных с использованием функции «применить». - PullRequest
0 голосов
/ 21 октября 2019

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

theta <- function(a,b) {
angle <- (180/pi)*acos( sum(a*b) / ( sqrt(sum(a * a)) * sqrt(sum(b * b)) ) )
return(angle)
}

Я пытаюсь применить эту функцию к 5 подобным кадрам данных отдельно. Для каждого фрейма данных в каждой строке хранится информация о наблюдении, а 4 из столбцов фрейма данных представляют 4 координаты 4D-вектора, который определяет свойство каждого наблюдения

Для всех строк я хочу найти уголмежду вектором a, извлеченным из 4 столбцов, и вектором b, еще один 4-мерный вектор, который я хочу указать. Вектор b различен для каждого кадра данных.

Я использую метод apply и вызываю созданную мной ранее функцию для вычисления угла между двумя векторами и сохраняю его в новом столбце под названием angle.

df$angle <- apply(df[,c(7:10)],1, theta))

Однако я не уверен, как использовать метод apply таким образом, чтобы я мог вручную указать вектор угла b при вызове моей функции "theta". Вот почему мне пришлось прибегнуть к предварительному определению значения вектора b, когда функция определяется сама, как это:

theta <- function(a,b) {
b= c(1,2,3,4)
angle <- (180/pi)*acos( sum(a*b) / ( sqrt(sum(a * a)) * sqrt(sum(b * b)) ) )
return(angle)
}

Проблема в том, что у меня есть 5 разных фреймов данных, где у меня 5разные векторы b, я должен каждый раз определять функцию с новым b, прежде чем применить ее к кадру данных.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Правильный формат:

df$angle <- apply(df[,c(7:10)],1, theta, b= c(1,2,3,4))
0 голосов
/ 21 октября 2019

Функции карт из пакетов purrr:: допускают такую ​​функцию

Например, map2() использует 2 аргумента и применяет функцию

list_df <- list(df1, df2)
list_b <- list(vecb_1, vecb_2)
list_angle <- map2(.x = list_df, .y = list_b, .f = theta)
...