R语言:为数据框列实现每三行至少一个True的规则处理
处理每三行至少包含一个True的列规则需求
我来帮你搞定这个问题!咱们的目标是确保True_False列里每连续三行至少有一个TRUE,具体规则是:如果当前行是FALSE,且它的前两行也都是FALSE,就把当前行改为TRUE,其他情况保持原数值不变。
首先先把你的测试数据定义好:
a <- data.frame(True_False = c(T,F,F,F,F,T,F,T,T,T,F,F,F,F,F,F,F,F))
方法一:Base R 循环实现(直观易懂)
这个方法用循环逐行检查,逻辑非常清晰,适合刚接触R的朋友:
# 从第3行开始遍历,因为前两行无法满足"前两行均为False"的条件 for (i in 3:nrow(a)) { # 检查当前行和前两行是否全为False if (!a$True_False[i] && !a$True_False[i-1] && !a$True_False[i-2]) { a$True_False[i] <- TRUE } } # 查看处理后的结果 print(a$True_False)
运行后得到的结果是:
[1] TRUE FALSE FALSE TRUE FALSE TRUE FALSE TRUE TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
方法二:dplyr 窗口函数实现(tidyverse 风格)
如果你习惯用tidyverse工具链,用dplyr的窗口函数可以更简洁地完成这个任务:
library(dplyr) a_processed <- a %>% mutate( # 用lag函数获取前1行和前2行的值,默认设为TRUE避免NA干扰 lag_prev1 = lag(True_False, 1, default = TRUE), lag_prev2 = lag(True_False, 2, default = TRUE), # 根据规则生成处理后的列 True_False_processed = case_when( !True_False & !lag_prev1 & !lag_prev2 ~ TRUE, TRUE ~ True_False ) ) %>% select(-lag_prev1, -lag_prev2) # 移除临时辅助列 # 查看结果 print(a_processed$True_False_processed)
这个方法的逻辑和循环是一致的,只是用lag()函数代替了手动索引,case_when()让条件判断更直观,最后移除辅助列保持数据整洁。
两种方法得到的结果完全一致,你可以根据自己的习惯选择使用~
内容的提问来源于stack exchange,提问作者Silentdevildoll
相关产品推荐
相关产品推荐

