for循环中使用dplyr的filter函数结果异常如何解决?
问题原因
你的代码有3个核心错误,直接导致结果不符合预期:
- 循环迭代序列设置错误:
for (i in 36:39)生成的迭代序列只有36、37、38、394个整数值,总共只会执行4次循环,根本不会按你预期的步长0.15生成20个区间。 - 列引用错误:在
dplyr管道操作中,你直接引用了原始全局环境下的emi_sigma$V1、emi_sigma1$V2列,而不是管道传入的当前子集的对应列。这会导致过滤、取最小值的逻辑和你当前处理的子集完全不匹配,长度不一致时就会返回空结果。 - 无效代码:循环内的
i == i + 0.15是逻辑判断语句,既不会修改变量i的值,也不会改变for循环的迭代节奏,属于完全无效的代码。R的for循环迭代变量是严格按照你预先给定的序列依次赋值的,循环体内对迭代变量的修改不会影响下一轮的迭代取值。
修正方案
循环写法修正
先手动生成符合步长要求的区间起点序列,再执行循环,管道操作中直接引用列名即可,不要加原始数据框前缀:
library(dplyr) # 生成20个区间的左端点,步长0.15,范围36~39 interval_left <- seq(36, 39 - 0.15, by = 0.15) res_list <- vector("list", length(interval_left)) for (j in seq_along(interval_left)) { l <- interval_left[j] r <- l + 0.15 sub_data <- emi_sigma1 %>% filter(between(V1, l, r)) min_row <- sub_data %>% slice_min(V2) res_list[[j]] <- min_row } # 合并所有区间的结果 final_res <- bind_rows(res_list)
更简洁的非循环写法
直接用分箱函数给数据打区间标签后分组计算,不需要写循环,出错概率更低:
final_res <- emi_sigma1 %>% mutate( interval_tag = cut( V1, breaks = seq(36, 39, by = 0.15), include.lowest = TRUE, right = TRUE ) ) %>% group_by(interval_tag) %>% slice_min(V2) %>% ungroup()
内容的提问来源于stack exchange,提问作者Marco Antonio Oliveira
相关产品推荐
相关产品推荐

