【发布时间】:2020-12-17 05:08:32
【问题描述】:
我有一个基于输入变量计算某些东西的函数,但我想根据函数的结果更改输入变量。我觉得这是一个非常琐碎的问题,但我还没有找到一个可行的解决方案。
我有一个类似这样的数据集:
v1<-sample(5:12, 10, replace=T)
v2<-rep(100, 10)
v3<-rep(1,10)
v4<-sample(1:4, 10, replace=T)
t1<-sample(10:30, 10, replace=T)
还有一个使用变量 v1 到 v4 进行计算的函数:
fun<-function(v1, v2, v3, v4){
#does complicated things
result<-((v2/(v1*v4))*v3
return(result)
}
out<-fun(v1, v2, v3, v4)
df<-data.frame(v1, v2, v3, v4, t1, out)
我需要 t1
while (out < t1){
v3= v3 + 1
out<- fun(v1, v2, v3, v4)
}
理想情况下,v3 的最后一个值以某种方式存储。
v1 v1 v2 v3 v4 t1 out out_new v3_new
1 6 100 1 2 15 8.333333 16 2
2 12 100 1 2 17 4.166667 20 5
3 5 100 1 1 12 20.000000 20 1
4 10 100 1 4 26 2.500000 . .
5 8 100 1 2 15 6.250000 . .
6 6 100 1 3 18 5.555556
7 10 100 1 4 20 2.500000
8 11 100 1 2 12 4.545455
9 12 100 1 3 28 2.777778
10 6 100 1 2 25 8.333333
我正在寻找的输出是一个如下所示的数据框: 我正在寻找的是一种适用于大型(100.000 行)数据框/小标题的矢量化解决方案。我尝试了使用 dplyr 的不同方法(使用 case_when、ifelse 进行变异),但未能提出可行的解决方案。
【问题讨论】:
-
我不明白你的问题。你能展示你预期的最终输出吗?
-
你到底要计算什么?为什么不直接计算所有行的整个结果,然后使用
filter删除t1 >= out所在的行。df %>% mutate(out = fun(v1, v2, v3, v4)) %>% filter(t1 < out). -
如果您不想过滤掉行,您可以将
filter更改为第二个mutate(out = ifelse(t1 >= out, NULL, out)) -
我认为他想增加
v3直到out大于t1。 -
这是有道理的。问题是
v3是否应该在结果中更新,以及它是否是固定间隔增加的。在 mutate 中使用v3 + seq(n())可以实现while循环的效果。
标签: r dataframe while-loop dplyr