按一个列的绝对值排序,同时在R中保持另一列的相等值

时间:2017-11-15 16:19:21

标签: r dataframe

示例data.frame:

df <- data.frame(study = c('A', 'A', 'B', 'C', 'D', 'D'),
                 similarity = c(0.61, 0.58, -0.605, 0.4, 0.607, 0.3))

df
   study similarity
1     A      0.610
2     A      0.580
3     B     -0.605
4     C      0.400
5     D      0.607
6     D      0.300

我想以绝对similarity命令,但要保持相同的学习价值。对于上面的示例,结果应为:

   study similarity
1     A      0.610
2     A      0.580
5     D      0.607
6     D      0.300
3     B     -0.605
4     C      0.400

4 个答案:

答案 0 :(得分:2)

在基地R

df[order(-ave(df$similarity,df$study,FUN=function(x) max(abs(x))),df$study),]
  study similarity
1     A      0.610
2     A      0.580
5     D      0.607
6     D      0.300
3     B     -0.605
4     C      0.400

答案 1 :(得分:2)

data.table解决方案:

library(data.table)
setDT(df)[order(-abs(similarity)), .SD, by = study]

<强>结果:

   study similarity
1:     A      0.610
2:     A      0.580
3:     D      0.607
4:     D      0.300
5:     B     -0.605
6:     C      0.400

答案 2 :(得分:1)

这是使用tidyverse的方法

library(tidyverse)

 df %>%
    group_by(study) %>%  #group by study
    mutate(arr = max(abs(similarity))) %>% #get maximum absolute similarity by group
    ungroup() %>%
    arrange(desc(arr)) %>% #arrange according to by group maximum absolute similarity
    select(-arr) #leave the helper column out
#ouput

# A tibble: 6 x 2
   study similarity
  <fctr>      <dbl>
1      A      0.610
2      A      0.580
3      D      0.607
4      D      0.300
5      B     -0.605
6      C      0.400

答案 3 :(得分:0)

使用dplyr的解决方案。此解决方案看起来比其他解决方案更复杂,但它的目的是生成预期输出,即使study列不符合要求,或者来自不同similarity组的study中存在关联。< / p>

首先,计算每个相似度的绝对值(df2)。

其次,计算每项研究的最大绝对值(df3)。

第三,根据df3中的顺序将研究列转换为因子列。根据{{​​1}}和绝对值(study

排列列
df4