首页 > 解决方案 > 无论如何可以从 dplyr 一起使用滞后和领先功能

问题描述

我有几个 *.txt 文件看起来像

ID BP
Id1 A
Id2 A
Id3 T
Id4 C
Id5 A
Id6 T
Id7 A
Id8 T

我想要每个 ID 的前 4 个 BP 字符和接下来的 2 个 BP 字符

就像是:

Id5 A CTAA TA 
Id6 T TACT AT 

我试图通过使用dplyr 中的laglead函数来实现这一点,但无法按预期获得输出。

标签: rdplyr

解决方案


lead如果您的窗口大小增加/减少,lag您可以使用滚动操作来轻松调整,而不是使用。

library(dplyr)
library(zoo)

df %>%
  mutate(result1 = lag(rollapplyr(BP, 4, function(x) 
                       paste0(rev(x), collapse = ''), fill = NA)), 
         result2 = rollapply(BP, 2, align = 'left', function(x) 
                       paste0(rev(x), collapse = ''), fill = NA))

#   ID BP result1 result2
#1 Id1  A    <NA>      AA
#2 Id2  A    <NA>      TA
#3 Id3  T    <NA>      CT
#4 Id4  C    <NA>      AC
#5 Id5  A    CTAA      TA
#6 Id6  T    ACTA      AT
#7 Id7  A    TACT      TA
#8 Id8  T    ATAC    <NA>

@G 的建议。rev格洛腾迪克用and避免了上述的怪异方式lag

df %>% 
  mutate(result11 = rollapply(BP,list(-(1:4)), paste, collapse = '', fill = NA), 
         result2 = rollapply(BP, list(1:2), paste, collapse = '', fill = NA))

推荐阅读