R скользит окно через тибл - PullRequest
1 голос
/ 24 апреля 2020

У меня простой вопрос, который я не могу найти решения. Кроме того, я не нашел ответ, который понимаю.

Представьте, что у меня есть этот фрейм данных

(ts <- tibble(
+   a = LETTERS[1:10],
+   b = c(rep(1, 5), rep(2,5))
+ ))
# A tibble: 10 x 2
   a         b
   <chr> <dbl>
 1 A         1
 2 B         1
 3 C         1
 4 D         1
 5 E         1
 6 F         2
 7 G         2
 8 H         2
 9 I         2
10 J         2

То, что я хочу, просто. Я хочу построить df со столбцом b, индексирующим скользящее окно, размер которого nf столбца a.

Выходные данные могут быть примерно такими:

# A tibble: 8 x 2
      b a    
  <dbl> <chr>
1     1 A B  
2     1 B C  
3     1 C D  
4     1 D E  
5     2 F G  
6     2 G H  
7     2 H I  
8     2 I J  

Я надеваю все равно, если столбец a содержит массив (значения гнезда). Мне просто нужен новый фрейм данных на основе скользящего окна.

Поскольку эта операция будет выполняться в реляционной базе данных, мне нужна функция, совместимая с DBI- PostgresSQL.

Любая помощь приветствуется.

Заранее спасибо

1 Ответ

1 голос
/ 24 апреля 2020

Мы можем сгруппировать по 'b', создать новый столбец на основе lead из 'a', удалить строки NA с na.omit

library(dplyr)
ts %>% 
    group_by(b) %>% 
    mutate(a2 = lead(a)) %>% 
    ungroup %>%
    na.omit %>%
    select(b, everything())
# A tibble: 8 x 3
#      b a     a2   
#  <dbl> <chr> <chr>
#1     1 A     B    
#2     1 B     C    
#3     1 C     D    
#4     1 D     E    
#5     2 F     G    
#6     2 G     H    
#7     2 H     I    
#8     2 I     J    

Если lead не работает, затем просто удалите первый элемент, добавьте NA в конце на шаге mutate

ts %>%  
     group_by(b) %>% 
     mutate(a2 = c(a[-1], NA)) %>%
     ungroup %>% 
     na.omit %>% 
     select(b, everything())
...