R-使用“应用”功能将具有多个输入的功能应用于所有数据框行

时间:2019-10-21 08:38:49

标签: r dataframe apply

我编写了以下函数,要计算输入的两个向量之间的角度

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

我试图将此功能分别应用于5个相似的数据帧。对于每个数据框,每一行都存储有关观测值的信息,并且数据帧的列中的4表示定义每个观测值属性的4D向量的4个坐标

对于所有行,我想找到从4列中提取的向量a与向量b(我希望指定的另一个4-D向量)之间的夹角。每个数据帧的向量b都不相同。

我正在使用“ apply”方法并调用我先前创建的函数来计算两个向量之间的角度,并将其存储在名为“ angle”的新列中。

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

但是,我不确定如何以某种方式使用apply方法,从而可以在调用函数“ theta”时手动指定角度为b的向量。这就是为什么当函数本身定义时,我不得不求助于向量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 :(得分:0)

purrr::包中的map函数允许这种功能

例如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)

答案 1 :(得分:0)

正确的格式似乎是:

df$angle <- apply(df[,c(7:10)],1, theta, b= c(1,2,3,4))
相关问题