【问题标题】:R- Applying function with multiple inputs to all dataframe rows using "apply" functionR-使用“应用”功能将具有多个输入的功能应用于所有数据框行
【发布时间】:2019-10-21 08:38:49
【问题描述】:

我已经编写了以下函数,我想计算我输入的 2 个向量之间的角度

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 定义函数。

任何帮助将不胜感激!

【问题讨论】:

    标签: r dataframe apply


    【解决方案1】:

    正确的格式似乎是:

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

    【讨论】:

      【解决方案2】:

      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)
      

      【讨论】:

      • 当我尝试它并将我的参数作为 listdf
      猜你喜欢
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 2021-12-11
      相关资源
      最近更新 更多