r-一种计算效率高的方法,可以找到每个类型2行正上方和下方的类型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循环来实现这一点,但对于我正在处理的数据集来说,这太耗时了。

一种方法使用dplyrleadlag分别获得下一个和上一个值,使用data.tablerleid创建连续的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

仅限dplyr的解决方案:

您可以创建自己的rleid函数,然后应用Ronak提供的逻辑(非常感谢。投票支持(。

library(dplyr)
my_func <- function(x) {
x <- rle(x)$lengths
rep(seq_along(x), times=x)
}
# this part is the same as provided by Ronak.
df %>%
mutate(IDabove = ifelse(Type == 2, lag(ID), NA), 
IDbelow = ifelse(Type == 2, lead(ID), NA), 
grp = my_func(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

最新更新