首页 > 解决方案 > 将带有多个参数和一些常量的函数向下传递到数据框列,并为向量中的每个项输出一个新列

问题描述

我正在尝试在我的 df 中使用一个列,该 df 称为组合,作为我函数中的参数“h”。以及向量'v'。df是:

向量是ve:-str(ve) - num [1:6] 1.37 2.4 2.23 3.2 2.9 3.22

功能是:

f<-function(h, v){
  m_k<- (Density*h)/(Cd*v)
  y<- m_k*(v*sin(a)+(m_k*g))
  return (y)
}

其中DensityCd是常数。运行时出现以下错误f(combo$fake, ve)

警告信息:

1:在(密度 * h)/(镉 * v):

较长的对象长度不是较短对象长度的倍数

我知道它们的长度不一样。但是我希望 R 使用 中的ve每个术语的第一项来应用函数,首先combo$fake生成一列,ve然后用第二项重复,ve最后我有 6 列和 10 行结果由函数给出。

我尝试过使用 apply 函数和 for 循环,以及像 with 一样显式引用参数combo$fake,但我想避免对函数进行硬编码(否则我不会使用函数)。这只是一个样本,我的真实数据集要大得多。

这是我尝试过的一些示例以及数据框的一部分。

combo$fake $funny
        <dbl>  <int>
 1  0.0000224      1
 2  0.000024       2
 3  0.0000269      3
 4  0.0000287      4
 5  0.0000314      5
 6  0.0000324      6

y<-    for (i in seq_len(ve))  {
  for(j in seq_along(combo$fake))

    f(combo$fake, ve)
}
y<- mapply(f, ve, combo$fake)

我已经尝试在 stackoverflow 上阅读其他类似的问题,但我无法让它工作:-(。不用说,我是 R 的新手,请帮助并提前谢谢你。

标签: rfunctionloopsapply

解决方案


mapply获取每个参数的第一个元素并将其放入您的函数中,然后继续处理每个参数的第二个元素,依此类推。您可以通过重复其元素来简单地将参数转换为所需的形状,这样在使用 的下一个值之前,元素 oneve与 的每个元素组合。所以本质上使用它的参数和.df$fakevereptimeseach

如果我正确理解您的问题,您可以使用以下内容:

# your function and its constants
f<-function(h, v){
  Density <- 10
  Cd <- 10
  a <- 10
  g <- 10
  m_k<- (Density*h)/(Cd*v)
  y<- m_k*(v*sin(a)+(m_k*g))
  return (y)
}

# some dataframe and vector
df <- data.frame(fake = 1:10)
ve <- 20:25

# call mapply by repeating df$fake by the length of vector
# and repeat each element in the vector by the number of elements in df$fake
results <- mapply(f, rep(df$fake, times = length(ve)),
                     rep(ve, each = length(df$fake)))

# reshape the output
matrix(results, nrow=length(df$fake), ncol=length(ve))

推荐阅读