r - 一种计算有效的方法来查找每个 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 循环来实现这一点,但这对于我正在处理的数据集来说太耗时了。
解决方案
一种方法使用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