Фрейм данных с несколькими столбцами, из группы одинаковых значений в одном столбце выберите максимальное значение в другом столбце

#r

#r

Вопрос:

У меня есть следующий фрейм данных:

 DF <- data.frame(A=c(0.1,0.1,0.1,0.1,0.2,0.2,0.2,0.3,0.4,0.4 ), B=c(1,2,1,5,10,2,3,1,6,2), B=c(1000,50,400,6,300,2000,20,30,40,50))
  

и я хочу отфильтровать DF для каждой группы равных значений в A выберите максимальное значение в B.

Например, для 0.1 в A максимум в B равен 5.

Заканчивается новым фреймом данных:

 A    B    C  
0.1  5    6  
0.2  10   300  
0.3  1    30  
0.4  6    40
  

Я не уверен, нужно ли решать эту проблему с помощью base R или с помощью библиотеки. Потому что я думаю использовать dplyr и группу A. Я прав?

Ответ №1:

Есть несколько базовых параметров R:

  • Используя subset ave
 > subset(DF,as.logical(ave(B,A,FUN = function(x) x == max(x))))
    A  B B.1
4 0.1  5   6
5 0.2 10 300
8 0.3  1  30
9 0.4  6  40
  
  • Используя merge aggregate
 > merge(aggregate(B~A,DF,max),DF)
    A  B B.1
1 0.1  5   6
2 0.2 10 300
3 0.3  1  30
4 0.4  6  40
  

Ответ №2:

Вариант с data.table where group by ‘A’, получить индекс, где ‘B’ max с which.max , обернуть с .I , чтобы вернуть индекс строки. Если мы не указываем или не переименовываем, по умолчанию он возвращается как столбец ‘V1’, который мы извлекаем как вектор для подмножества строк dataset

 library(data.table)
setDT(DF)[DF[, .I[which.max(B)], A]$V1]
  

-вывод

 #     A  B B.1
#1: 0.1  5   6
#2: 0.2 10 300
#3: 0.3  1  30
#4: 0.4  6  40
  

Ответ №3:

Вы правы, используя dplyr и группировку по A , вы можете использовать slice_max() (также из dplyr) для выбора максимального значения B для каждой группы

 library(dplyr)

DF %>% 
  group_by(A) %>% 
  slice_max(B) 
  

Вывод:

 # A tibble: 4 x 3
# Groups:   A [4]
      A     B     C
  <dbl> <dbl> <dbl>
1   0.1     5     6
2   0.2    10   300
3   0.3     1    30
4   0.4     6    40
  

Комментарии:

1. slice_max(B) не сработало, мне пришлось изменить на slice(which.max(B) Спасибо