gpt4 book ai didi

r - 递归函数在 R 中的 dplyr 上下文中的应用

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

我确实将 dplyr 用于几乎(如果不是全部)我的数据处理,但我总是在 R 中遇到一件事:递归计算。
上下文:我有一个已排序的数据框,其中存储了 ID 的项目(因此是“组”概念)与一些 VALUES .其中一些缺失,但可以使用系数 COEFF 迭代计算。 .我正在寻找一种简单而优雅的方式来做到这一点(没有循环)。有什么线索吗?
注意:我们假设每个 ID 总是有第一个非 NA 值。 .
下面是具有预期解决方案的可重现示例:

df <- data.frame(ID = rep(letters[1:2], each = 5),
VALUE = c(1, 3, NA, NA, NA, 2, 2, 3, NA, NA),
COEFF = c(1, 2, 1, .5, 100, 1, 1, 1, 1, 1)
)

df_full <- df
# SOLUTION 1: Loop
for(i in 1:nrow(df_full))
{
if(is.na(df_full$VALUE[i])){
df_full$VALUE[i] <- df_full$VALUE[i-1]*df_full$COEFF[i]
}
}
df_full
# ID VALUE COEFF
#1 a 1.0 1.0
#2 a 3.0 2.0
#3 a 3.0 1.0
#4 a 1.5 0.5
#5 a 150.0 100.0
#6 b 2.0 1.0
#7 b 2.0 1.0
#8 b 3.0 1.0
#9 b 3.0 1.0
#10 b 3.0 1.0

# PSEUDO-SOLUTION 2: using Reduce()
# I struggle to apply this approach for each "ID", like we could do in dplyr using dplyr::group_by()
# Exemple for the first ID:
Reduce(function(v, x) x*v, x = df$COEFF[3:5], init = df$VALUE[2], accumulate = TRUE)

# PSEUDO-SOLUTION 3: dplyr::lag()
# We could think that we just have to use the lag() function to get the previous value, like such:
df %>%
mutate(VALUE = ifelse(is.na(VALUE), lag(VALUE) * COEFF, VALUE))
# but lag() is not "refreshed" after each calculation, it basically takes a copy of the VALUE column at the begining and adjust indexes.

最佳答案

一种完全递归的方式:

calc <- function(val,coef){
for(i in 2:length(val))
{
if(is.na(val[i])){
val[i] <- val[i-1]*coef[i]
}
}
return(val)
}

library(dplyr)
df %>%
group_by(ID) %>%
mutate(newval = calc(VALUE, COEFF))

ID VALUE COEFF newval
<chr> <dbl> <dbl> <dbl>
1 a 1 1 1
2 a 3 2 3
3 a NA 1 3
4 a NA 0.5 1.5
5 a NA 100 150
6 b 2 1 2
7 b 2 1 2
8 b 3 1 3
9 b NA 1 3
10 b NA 1 3
group_by提供给 mutate每个 ID 的原始数据字段的子集。
然后,您可以在标准递归循环中处理这些向量,并将长度相等的结果向量返回给 mutate。将结果放在一起的语句。
如果您需要速度,可以使用 Rcpp 轻松加速 for 循环。 :
library(Rcpp)
Rcpp::cppFunction('
NumericVector calc(NumericVector val, NumericVector coef) {
int n = val.size();
int i;
for (i = 1;i<n;i++){
if(R_IsNA(val[i])){
val[i] = val[i-1]*coef[i];
}
}
return val;
}')

关于r - 递归函数在 R 中的 dplyr 上下文中的应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62660985/

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