根据组内参考值按组更改值

时间:2019-02-15 20:46:54

标签: r dataframe dplyr tidyverse mutate

提供了具有定义的组的表,其中每个组内 我只有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 :(得分:2)

这是一种实现方法:

onError

结果:

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))