Изменить значение по группе на основе ссылки внутри группы - PullRequest
0 голосов
/ 15 февраля 2019

с учетом таблицы с определенными группами, где в каждой группе у меня есть только 1 ссылка (запрос). Я бы хотел изменить все значения столбца в зависимости от значения ссылки.
Эти значения равны 1 или -1,

Идея такова:
- если ссылка равна 1, сохраните все значения как есть
- но если ссылка равна -1, то все значения должны быть умножены на -1, чтобыпуть ссылки стал равным 1, а элементы со значением 1 стали равными -1
- Кроме того, измененные группы должны иметь противоположный порядок

Я пытаюсь сделать так:

library(tidyverse)
item <- c("a", "b", "c",  "d", "e", "f", "g",  "h", "i",  "j",  "k",  "l")
grou <- c(1, 1, 1,  2, 2, 2, 3,  3, 3,  4,  4,  4)
quer <- c(0, 1, 0,  0, 1, 0, 0,  1, 0,  0,  1,  0)
dir  <- c(1, 1, 1, -1, 1, 1, 1, -1, 1, -1, -1, -1)
ds <- tibble(item      = item,
                 group     = grou,
                 query     = quer,
                 direction = dir)
ds %>% 
  group_by(group) %>%
  mutate( 
    direction = ifelse( 
      direction[query == 1] == 1, direction, (-1 * direction)  
    ) 
  )

Итак, это

# A tibble: 12 x 5
# Groups:   group [4]
   item  group query direction 
   <chr> <dbl> <dbl>     <dbl> 
 1 a         1     0         1 
 2 b         1     1         1 
 3 c         1     0         1 
 4 d         2     0        -1 
 5 e         2     1         1 
 6 f         2     0         1 
 7 g         3     0         1 
 8 h         3     1        -1 
 9 i         3     0         1 
10 j         4     0        -1 
11 k         4     1        -1 
12 l         4     0        -1 

Должно стать таким

# A tibble: 12 x 5
# Groups:   group [4]
   item  group query direction 
   <chr> <dbl> <dbl>     <dbl> 
 1 a         1     0         1 
 2 b         1     1         1 
 3 c         1     0         1 
 4 d         2     0        -1 
 5 e         2     1         1 
 6 f         2     0         1 
 7 i         3     0        -1 
 8 h         3     1         1 
 9 g         3     0        -1 
10 l         4     0         1 
11 k         4     1         1 
12 j         4     0         1 

Но это не работает.

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

1 Ответ

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

Вот способ сделать это:

ds %>%
  rowid_to_column("id") %>%
  group_by(group) %>%
  mutate(tmp = max(query * direction) - 0.5,
         direction = tmp * 2 * direction) %>%
  arrange(id * tmp, .by_group = TRUE) %>%
  select(-c(id, tmp))

Результат:

# A tibble: 12 x 4
# Groups:   group [4]
   item  group query direction
   <chr> <dbl> <dbl>     <dbl>
 1 a         1     0         1
 2 b         1     1         1
 3 c         1     0         1
 4 d         2     0        -1
 5 e         2     1         1
 6 f         2     0         1
 7 i         3     0        -1
 8 h         3     1         1
 9 g         3     0        -1
10 l         4     0         1
11 k         4     1         1
12 j         4     0         1
...