我有这种格式的数据框:
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))
我的目标是确定每个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框架中是否有一种简单的方法来实现这一目标?
按“ pair_id”分组后,在“值”列上使用which.min
和which.max
获取用于子集相应“ 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) )
根据OP的注释,我们将arrange
'pair_id'和'value'降序排列,并按'pair_id'分组,如果'value'中不同元素的数量等于1,则分别指定“ higher”,“ lower”通过按“较高”顺序,然后按“较低”顺序分配sample
或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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句