установить idx foward и обратный столбец на основе начальной точки в группе - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть вопрос о чем-то, с чем я пытаюсь разобраться.

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

| index | item | group | reference |  
|-------|------|-------|-----------|  
| 1     | a    | 0     | 0         |  
| 2     | b    | 0     | 0         |  
| 3     | c    | 0     | 1         |  
| 4     | d    | 0     | 0         |  
| 5     | e    | 0     | 0         |  
| 6     | f    | 1     | 0         |  
| 7     | g    | 1     | 0         |  
| 8     | h    | 1     | 1         |  
| 9     | i    | 1     | 0         |  
| 10    | j    | 1     | 0         |  
|-------|------|-------|-----------|  

Я бы хотел, основываясь на reference == 1нумерация строк в каждой группе group_by(., group) начинает смещение по ссылке и увеличивает до нижнего значения и уменьшает до более высокого.
В конце у меня должно быть что-то вроде этого:

| index | item | group | reference | gidx |   
|-------|------|-------|-----------|------|  
| 1     | a    | 0     | 0         | -2   |
| 2     | b    | 0     | 0         | -1   |  
| 3     | c    | 0     | 1         | 0    |
| 4     | d    | 0     | 0         | 1    |
| 5     | e    | 0     | 0         | 2    |  
| 6     | f    | 1     | 0         | -2   |  
| 7     | g    | 1     | 0         | -1   |  
| 8     | h    | 1     | 1         | 0    |  
| 9     | i    | 1     | 0         | 1    |  
| 10    | j    | 1     | 0         | 2    |  
|-------|------|-------|-----------|------|  

Кто-нибудь знает, каксправиться с этим.
Лучше использовать dplyr или tidyverse.

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

1 Ответ

0 голосов
/ 11 февраля 2019

После группировки по 'group' мы можем вычесть row_number из индекса, где 'reference' равен 1 (при условии, что в 'reference' для каждой 'group' есть только одно значение 1)

library(tidyverse)
df1 %>% 
   group_by(group) %>%
   mutate(gidx = row_number() - which(reference == 1))
   # or use which.max`
   # mutate(gidx = row_number() - which.max(reference))    
# A tibble: 10 x 5
# Groups:   group [2]
#   index item  group reference  gidx
#   <int> <chr> <int>     <int> <int>
# 1     1 a         0         0    -2
# 2     2 b         0         0    -1
# 3     3 c         0         1     0
# 4     4 d         0         0     1
# 5     5 e         0         0     2
# 6     6 f         1         0    -2
# 7     7 g         1         0    -1
# 8     8 h         1         1     0
# 9     9 i         1         0     1
#10    10 j         1         0     2

данные

df1 <- structure(list(index = 1:10, item = c("a", "b", "c", "d", "e", 
 "f", "g", "h", "i", "j"), group = c(0L, 0L, 0L, 0L, 0L, 1L, 1L, 
 1L, 1L, 1L), reference = c(0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 
  0L)), class = "data.frame", row.names = c(NA, -10L))
...