首页 > 解决方案 > 根据组内参考按组更改值

问题描述

给定一个包含已定义组的表,在每个组中我只有一个参考(查询),我想根据参考值更改列的所有值。
这个值只是 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 

但它不起作用。

提前致谢

标签: rdataframetidyversedplyr

解决方案


这是一种方法:

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

推荐阅读