如何在R中编写带条件逻辑的数据框处理函数并批量运行
修正后的函数实现
你的函数存在代码块范围错误:else后的代码未用大括号{}包裹,导致仅SA的赋值属于else分支,SB及后续计算会在所有条件下执行,逻辑不符合预期。以下是修正后的完整实现:
library(tidyverse) # 构造目标数据框 a = seq(1,5,1) b = seq(1,5,1) w = tibble(a,b) im = function(mat, window){ if(window == nrow(mat)){ # 窗口等于数据框行数时,取a首元素+b尾元素求和 mat[1,1] + mat[nrow(mat),2] } else { # 提取a列前window个元素 SA = mat %>% select(1) %>% slice_head(n=window) # 提取b列后window个元素 SB = mat %>% select(2) %>% slice_tail(n=window) # 对应元素求和后取最小值 min(SA + SB) } } # 测试用例 im(w,5) # 返回6,符合预期 im(w,2) # 返回5,符合预期
对窗口向量批量运行函数
针对窗口向量vec = seq(1,5,1),提供两种批量计算方式:
方式1:base R原生实现
vec = seq(1,5,1) # 批量运行并返回列表 result_list = lapply(vec, function(x) im(w, x)) # 转换为向量格式 result_vec = unlist(result_list) result_vec # 输出:[1] 2 5 8 11 6
方式2:tidyverse生态实现
library(purrr) # 直接返回数值向量 result_vec = map_dbl(vec, ~im(w, .x)) result_vec # 输出:[1] 2 5 8 11 6
补充说明:窗口=1时,取a列第1个元素与b列最后1个元素求和(1+5=2),符合设定逻辑。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

