在R中计算A列TRUE值对应前后B、C列最近TRUE值的行号差
R语言实现逻辑列的索引定位与差值计算
示例数据(可直接运行)
dta <- data.frame( Date = as.Date(c("2045-01-01", "2045-01-02", "2045-01-03", "2045-01-04", "2045-01-05", "2045-01-06")), Temp = c(2.666667, 5.095833, 7.445833, 12.050000, 15.162500, 7.716667), A = c(FALSE, FALSE, TRUE, TRUE, TRUE, TRUE), B = c(FALSE, TRUE, TRUE, TRUE, TRUE, TRUE), C = c(FALSE, FALSE, FALSE, FALSE, TRUE, FALSE) )
实现函数
calculate_diff <- function(df) { # 1. 获取A列所有TRUE值的行索引 a_indices <- which(df$A) # 2. 对每个A的位置,向前查找最近的B的TRUE索引 get_prev_b <- function(pos) { b_candidates <- which(df$B[1:pos]) if (length(b_candidates) == 0) NA else max(b_candidates) } i_vec <- sapply(a_indices, get_prev_b) # 3. 对每个A的位置,向后查找最近的C的TRUE索引 get_next_c <- function(pos) { c_candidates <- which(df$C[pos:nrow(df)]) if (length(c_candidates) == 0) NA else (pos + c_candidates[1] - 1) } j_vec <- sapply(a_indices, get_next_c) # 4. 整理结果:生成结果表 + 给原数据添加差值列 result_table <- data.frame( A_row_index = a_indices, nearest_B_index = i_vec, nearest_C_index = j_vec, diff_j_i = j_vec - i_vec ) df$diff_j_i <- NA df$diff_j_i[a_indices] <- j_vec - i_vec return(list(result_table = result_table, updated_data = df)) }
运行与查看结果
# 执行函数 output <- calculate_diff(dta) # 查看单独的差值结果表 print(output$result_table) # 查看带差值列的原数据 print(output$updated_data)
关键逻辑解释
which(df$A):快速定位A列中所有TRUE值的行索引,是后续操作的基础。get_prev_b:针对每个A的位置,只检索该位置及之前的行,筛选出B为TRUE的索引后取最大值(即最近的前一个B的位置),无匹配时返回NA。get_next_c:针对每个A的位置,检索该位置及之后的行,筛选出C为TRUE的索引后取最小值,再转换为原数据的全局索引,无匹配时返回NA。- 最终同时生成结构化的结果表和带差值列的原数据,满足不同分析需求。
内容的提问来源于stack exchange,提问作者Manan Singh
相关产品推荐
相关产品推荐

