根据组的最大变量的标识符

时间:2018-04-19 11:59:11

标签: r dataframe max

我有一个包含组(Gp)和变量值(y)的数据框。

我的数据

y <- c(5 , 0.22 , 0.23 , 0.17 , 0.36 , 3.33 , 5.30 , 0.39 , 0.35 ,
0.27 , 0.20 , 0.22 , 0.24 , 0.16 , 0.36 , 0.30 , 0.31 , 0.39 , 0.33 , 0.25 , 0.23 , 0.13 , 0.16 , 6.18 ,  0.20 ,1, 9.15 , 0.09 , 0.18 , 8 , 9 , 0.14 , 3 , 0.18 , 0.22 , 0.16 , 0.14 , 0.11 , 0.18 , 4 , 0.30 ,
0.36 , 0.40 , 0.42 , 8 , 0.23 , 0.25 , 0.30 ,  0.27 , 0.15 , 0.29 , 0.36 , 0.38 , 0.42 , 0.28 , 0.23 , 0.26 , 0.29 , 0.24 , 0.17 , 0.24 , 0.14 , 0.17 , 0.16 , 0.15 , 6 , 0.19 , 0.15 , 0.16 , 0.3) 

Gp <- c(1,2,2,1,2,1,2,2,2,2,3,2,1,2,2,2,2,2,2,2,1,2,2,2,2,1,3,2,2,1,2,2,3,2,
           2,2,2,1,2,3,1,2,2,1,2,2,2,2,3,2,2,1,2,3,2,2,3,2,2,2,3,2,2,2,3,2,2,2,2,3) 

tab <- data.frame(x=as.factor(Gp), y)

tab

   x    y

1  1 5.00

2  2 0.22

3  2 0.23

4  1 0.17

5  2 0.36

我想根据组获得最大变量的标识符。我试过了:

with(tab,tapply(y,x,max))  
  

1 2 3

     

8.00 9.00 9.15

预期结果:

  

30 31 27

     

1 2 3

     

8.00 9.00 9.15

带有 30,31和27

是最大值的标识。

2 个答案:

答案 0 :(得分:2)

以下是dplyr

的想法
library(dplyr)

tab %>% 
 mutate(index = row_number()) %>% 
 group_by(x) %>%  
 filter(y == max(y))

给出,

# A tibble: 3 x 3
# Groups:   x [3]
  x         y index
  <fct> <dbl> <int>
1 3      9.15    27
2 1      8.00    30
3 2      9.00    31

答案 1 :(得分:1)

使用基本R功能的解决方案。

sapply(sort(unique(Gp)), function(i) {
               ind <- which(Gp == i)
               ind[which.max(y[ind])]
})

# [1] 30 31 27

如果需要,下面打印Gp以便使用。 (排序功能是可选的)

sapply(sort(unique(Gp)), function(i) {
                ind <- which(Gp == i)  
                c(Gp = i, max_pos = ind[which.max(y[ind])])
})

#         [,1] [,2] [,3]
# Gp         1    2    3
# max_pos   30   31   27