определить более низкое и большее значение в сгруппированном кадре данных - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть датафрейм в этом формате:

 pair_id group_id value
 <int>    <int>   <dbl>
    1        1    0.600
    1        2    0.400
    2        3    0.500
    2        4    0.500
    3        5    0.200
    3        6    0.800
    4        7    0.300
    4        8    0.700
    5        9    0.500
    5       10    0.500

Генерируется с помощью следующего фрагмента кода:

library(tidyverse)

df <- tibble(pair_id = rep(1:5, each = 2),
             group_id = seq(1:10),
             value = c(0.6, 0.4, 0.5, 0.5, 0.2, 0.8, 0.3, 0.7, 0.5, 0.5))

Моя цель - определить, какой group_id в каждом pair_id имеет более высокое значение, а какой - более низкое. После определения я хочу присвоить «более высокий» для group_id с более высоким значением и «более низкое» для group_id с более низким значением.

Однако предостережение заключается в том, что если две группы имеют одинаковое значение (например, обе имеют значение 0,5, как в паре 2 и паре 5 в примере), следует определить присвоение «выше» или «ниже» наугад.

Цель состоит в том, чтобы создать фрейм данных с новым столбцом, скажем, group_rank, который должен выглядеть следующим образом:

pair_id group_id value group_rank
 <int>    <int> <dbl>  <chr>     
  1        1    0.600  higher    
  1        2    0.400  lower     
  2        3    0.500  higher    
  2        4    0.500  lower     
  3        6    0.800  higher    
  3        5    0.200  lower     
  4        8    0.700  higher    
  4        7    0.300  lower     
  5        9    0.500  lower     
  5       10    0.500  higher 

Есть ли простой способ достичь этого в рамках тидиверса?

1 Ответ

0 голосов
/ 26 апреля 2018

После группировки по 'pair_id' используйте which.min и which.max в столбце 'value', чтобы получить индекс строки для поднабора соответствующего 'group_id'

df %>% 
  group_by(pair_id) %>% 
  summarise(groupMin = group_id[which.min(value)], groupMax = group_id[which.max(value)])

ПРИМЕЧАНИЕ. Если для 'pair_id' есть несколько значений min или max, which.min или which.max получают только первый индекс


Если существует несколько значений min или max, используйте == и с помощью sample получите random 'group_id'

df %>%
   group_by(pair_id) %>%
   summarise(groupMin = sample(group_id[value == min(value)], 1),
             groupMax = sample(group_id[value == max(value)], 1) )

Обновление

Основываясь на комментариях ОП, мы arrange по 'pair_id' и 'value' в порядке убывания, сгруппированы по 'pair_id', если количество отдельных элементов в 'value' равно 1, тогда присваиваем " более высокие, более низкие значения с помощью sample ing или else присваивают его в порядке «выше», за которым следует «ниже»

df %>% 
   arrange(pair_id, desc(value)) %>% 
   group_by(pair_id) %>% 
   mutate(group_rank = case_when(n_distinct(value) == 1  ~ sample(c("higher", "lower")),
          TRUE ~ c("higher", "lower")))
# A tibble: 10 x 4
# Groups: pair_id [5]
#   pair_id group_id value group_rank
#     <int>    <int> <dbl> <chr>     
# 1       1        1 0.600 higher    
# 2       1        2 0.400 lower     
# 3       2        3 0.500 higher    
# 4       2        4 0.500 lower     
# 5       3        6 0.800 higher    
# 6       3        5 0.200 lower     
# 7       4        8 0.700 higher    
# 8       4        7 0.300 lower     
# 9       5        9 0.500 lower     
#10       5       10 0.500 higher    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...