【问题标题】:determine lower and higher value within a grouped dataframe确定分组数据框中的较低和较高值
【发布时间】:2018-04-26 09:48:24
【问题描述】:

我有一个这种格式的数据框:

 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

使用以下代码sn-p生成:

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

我的目标是确定每个 pair_id 中的哪个 group_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 

在 tidyverse 框架中是否有一种简单的方法来实现这一点?

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    按'pair_id'分组后,在'value'列上使用which.minwhich.max获取行索引,用于子集对应的'group_id'

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

    注意:如果“pair_id”有多个minmax 值,则which.minwhich.max 仅获取第一个索引


    如果有多个minmax 值,则使用==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) )
    

    更新

    基于 OP 的 cmets,我们 arrange 按 'pair_id' 和 'value' 降序排列,按 'pair_id' 分组,如果 'value' 中不同元素的数量等于 1,则分配 "更高”、“更低”的值由sampleing 或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    
    

    【讨论】:

    • 非常感谢您的回复。我更新了我的问题,因为它似乎有点不清楚。我添加了一个目标数据框来说明我的目标。最终目标是根据设定的要求生成具有“更高”或“更低”的数据帧。基本上,我正在寻找一种方法来立即分配这些类别。我希望仅在具有相同值的对中随机分配“更高”或“更低”,例如其中最小值 == 最大值。在所有其他情况下,我希望分配基于值是最大值还是最小值。
    • @HristoHristov 更新帖子
    • 非常感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多