如何在R中实现一列行与另一列后续5-10行的事件匹配并生成check列?
解决R中添加check列的问题
嗨,我来帮你搞定这个需求!根据你描述的规则——当某行的observ2为1,并且在它的前5到10天内存在observ1为1的记录时,对应行的check列显示TRUE(就像你说的第14行,因为第6行的observ1是1,和第14行间隔8天,正好在5-10天范围内),我给你两种常用的实现方案,分别适用于行号对应日期和有单独日期列的情况。
方案1:行号直接对应天数(无单独日期列)
如果你的数据表行号就是按日期顺序排列的,没有缺失的话,可以用dplyr包来快速实现:
首先加载dplyr(如果没安装的话先运行install.packages("dplyr")):
library(dplyr)
然后执行以下代码添加check列:
# 假设你的数据表叫df df <- df %>% mutate( check = case_when( # 只有当observ2为1时才检查条件 observ2 == 1 ~ sapply(row_number(), function(current_row) { # 计算需要检查的行范围:当前行前10天到前5天,确保不超出数据表边界 start_row <- max(1, current_row - 10) end_row <- max(1, current_row - 5) # 检查这个范围内的observ1是否有等于1的 any(observ1[start_row:end_row] == 1) }), # 其他情况都返回FALSE TRUE ~ FALSE ) )
方案2:数据表有单独的日期列(更准确)
如果你的数据表有格式为Date类型的日期列(比如叫date),用日期计算会更严谨,避免行号不连续的问题:
library(dplyr) df <- df %>% mutate( check = case_when( observ2 == 1 ~ sapply(date, function(current_date) { # 定义日期范围:当前日期往前推10天到5天 date_range <- between(date, current_date - 10, current_date - 5) # 检查该范围内的observ1是否有1 any(observ1[date_range] == 1) }), TRUE ~ FALSE ) )
如果你需要的是反过来的逻辑(observ1为1时检查后续5-10天的observ2)
如果你的需求其实是:当某行的observ1为1,并且在它之后的5-10天内有observ2为1,对应行的check显示TRUE,只需要稍微修改代码:
行号版本:
df <- df %>% mutate( check = case_when( observ1 == 1 ~ sapply(row_number(), function(current_row) { end_row <- min(nrow(df), current_row + 10) start_row <- min(nrow(df), current_row + 5) any(observ2[start_row:end_row] == 1) }), TRUE ~ FALSE ) )
日期版本:
df <- df %>% mutate( check = case_when( observ1 == 1 ~ sapply(date, function(current_date) { date_range <- between(date, current_date + 5, current_date + 10) any(observ2[date_range] == 1) }), TRUE ~ FALSE ) )
你可以根据自己的实际数据表结构选择对应的代码,运行后就能得到符合要求的check列啦!
内容的提问来源于stack exchange,提问作者Oluf Sändrostrom
相关产品推荐
相关产品推荐

