#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)
Спасибо