r - 将带有多个参数和一些常量的函数向下传递到数据框列,并为向量中的每个项输出一个新列
问题描述
我正在尝试在我的 df 中使用一个列,该 df 称为组合,作为我函数中的参数“h”。以及向量'v'。df是:
- 'data.frame':10 obs。2个变量:
- $假:数字2.24e-05 2.40e-05 2.69e-05 2.87e-05 3.14e-05 ...
- $搞笑:int 1 2 3 4 5 6 7 8 9 10
向量是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)
}
其中Density
和Cd
是常数。运行时出现以下错误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 的新手,请帮助并提前谢谢你。
解决方案
mapply
获取每个参数的第一个元素并将其放入您的函数中,然后继续处理每个参数的第二个元素,依此类推。您可以通过重复其元素来简单地将参数转换为所需的形状,这样在使用 的下一个值之前,元素 oneve
与 的每个元素组合。所以本质上使用它的参数和.df$fake
ve
rep
times
each
如果我正确理解您的问题,您可以使用以下内容:
# 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))
推荐阅读
- javascript - 如何修复函数执行顺序
- php - 使用php以json格式返回特定数组值
- ruby-on-rails - Rails - 如何为某些控制器方法自定义所需的参数?
- css - React Native ScrollView 不滚动到底部
- scala - 将列表中的所有内容大写
- sql - 通过将逗号分隔列表与逗号分隔列表匹配来过滤行
- ios - 在 UITableView 单元格滑动中选择“删除”,但未调用“提交编辑样式”
- batch-file - 批处理文件中 if 语句中的通配符
- spring-cloud-stream - Spring Cloud Stream 和 GCP pub sub 作为 binder 卡住
- c# - Windows 窗体:Metroframework 在 Windows 7 和 Windows 10 上看起来不同