gpt4 book ai didi

r - 在每一行数据帧上使用 dplyr 循环

转载 作者:行者123 更新时间:2023-12-03 23:18:51 25 4
gpt4 key购买 nike

我有一个数据框

df <- data.frame(var1=c(10,20,30,40,50), var2=c(rep(0.3,5)), BYGROUP_OBSNUM=c(0:4))

var1 var2 BYGROUP_OBSNUM
10 0.3 0
20 0.3 1
30 0.3 2
40 0.3 3
50 0.3 4

我需要使用 dplyr 对每一行进行计算,因为我的真实数据帧非常庞大,而且 dplyr 非常有效。

我想要的是:
var1    var2    BYGROUP_OBSNUM  VAR1_NEW
10 0.3 0 10
20 0.3 1 23
30 0.3 2 36.9
40 0.3 3 51.07
50 0.3 4 65.321

这是如何实现的:
var1    var2    BYGROUP_OBSNUM  VAR1_NEW    
10 0.3 0 10
20 0.3 1 20+10*0.3
30 0.3 2 30+20*0.3+10*0.3^2
40 0.3 3 40+30*0.3+20*0.3^2+10*0.3^3
50 0.3 4 50+40*0.3+30*0.3^2+20*0.3^3+10*0.3^4

因此,对于每一行,公式为:
 var1[i]+lag(var1,1)*var2^1+lag(var1,2)*var2^2 +.... 

直到滞后(var1)到达 BYGROUP_OBSNUM 为 0 的行

到目前为止我所取得的成就:
df1<-df %>%
mutate(var3=ifelse ((!(var2==0) | (!(BYGROUP_OBSNUM==0))), var2, 0)) %>%
rowwise()%>%
ungroup() %>%
mutate(var1_new=var1+lag(var1,1)*var2)

我需要更改最后一行,使公式从每行的滞后(var1,1)到滞后(var1,BYGROUP_OBSNUM),并且 var2 的幂也从 1 增加到 BYGROUP_OBSNUM。我该怎么做呢?

最佳答案

做出了最终的解决方案——

df<-data.frame(var1=c(1:10),var2=c(rep(c(0,0.1),each=5)),BYG‌​ROUP_OBSNUM=c(0:4)) 

my.func <- function(x){mapply(function(v1,v2,v3,n) {
if(v2==0 | v3==0){ as.numeric(v1) }
else {
sum(v1, x[rev(seq(1:(n-1))),1][1:v3] * v2 ^ seq(1:(n-1))[1:v3]) } },
x[,"var1"], x[,"var2"], x[,"BYGROUP_OBSNUM"],seq(1:nrow(x)))
}

df1 <- df %>%
do(data.frame(., my.func(.))) %>%
mutate(VAR1_NEW = my.func...)%>%
select(-my.func...)

在 1.42 分钟内完成了 10 万行!这个功能帮了大忙!谢谢!

关于r - 在每一行数据帧上使用 dplyr 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44777321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com