R语言data.frame中查找收发人互换的下一行并计算count差值的方法
基于tidyverse的实现方案
你可以用dplyr的行处理逻辑完成需求,代码示例如下:
首先加载依赖包:
library(tidyverse)
示例数据集构造(和给出的测试数据一致):
id = 1:10 sender = c(1, 2, 3, 2, 3, 1, 2, 1, 2, 3) recipient = c(2, 1, 2, 3, 1, 2, 3, 3, 1, 1) count = c(1, 4, 5, 7, 12, 17, 24, 31, 34, 41) df <- data.frame(id, sender, recipient, count)
核心处理代码:
df_result <- df %>% # 按行逐行处理记录 rowwise() %>% mutate( diff_count = { # 查找当前行之后第一个收发身份互换的记录 match_count <- df %>% filter( id > cur_data()$id, sender == cur_data()$recipient, recipient == cur_data()$sender ) %>% # 仅保留首个匹配结果 slice_head(n = 1) %>% pull(count) # 匹配成功返回count差值,匹配失败返回NA ifelse(length(match_count) == 1, match_count - count, NA_real_) } ) %>% # 取消行分组模式,避免影响后续数据处理 ungroup()
运行后得到的df_result$diff_count和预期输出完全一致:3 13 2 NA 19 17 NA 10 NA NA
如果需要处理的数据集量级较大,可以提前为每一对收发组合生成不区分顺序的唯一分组标识,按组处理可进一步提升运行效率。
内容的提问来源于stack exchange,提问作者Tor97
相关产品推荐
相关产品推荐

