首页 > 解决方案 > 一种计算有效的方法来查找每个 Type 2 行上方和下方的 Type 1 行的 ID?

问题描述

我有以下数据

df <- tibble(Type=c(1,2,2,1,1,2),ID=c(6,4,3,2,1,5)) 

Type ID
1    6
2    4
2    3
1    2
1    1
2    5

对于类型 2 行中的每一行,我想在它们的正下方和上方找到类型 1 行的 ID。对于上述数据集,输出将是:

Type ID IDabove IDbelow
1    6  NA      NA
2    4  6       2
2    3  6       2
1    2  NA      NA
1    1  NA      NA
2    5  1       NA

天真地,我可以编写一个 for 循环来实现这一点,但这对于我正在处理的数据集来说太耗时了。

标签: ralgorithmsorting

解决方案


一种方法使用dplyr lead,lag分别获取下一个和上一个值,并使用data.table'srleid创建连续Type值组。

library(dplyr)
library(data.table)

df %>%
  mutate(IDabove = ifelse(Type == 2, lag(ID), NA), 
         IDbelow = ifelse(Type == 2, lead(ID), NA), 
         grp = rleid(Type)) %>%
  group_by(grp) %>%
  mutate(IDabove = first(IDabove), 
         IDbelow = last(IDbelow)) %>%
  ungroup() %>%
  select(-grp)

#   Type    ID IDabove IDbelow
#  <dbl> <dbl>   <dbl>   <dbl>
#1     1     6      NA      NA
#2     2     4       6       2
#3     2     3       6       2
#4     1     2      NA      NA
#5     1     1      NA      NA
#6     2     5       1      NA

推荐阅读